MySQL/Galera是MySQL/InnoDB的多主集群,有以下特性: - 同步复制 - Active-active的多主拓扑结构 - 集群任意节点可以读和写 - 自动身份控制,失败节点自动脱离集群 - 自动节点接入 - 真正的基于”行”级别和ID检查的并行复制 - 无单点故障,易扩展
# yum install gcc gcc-c++
- 确认安装有boost-devel的版本至少为1.4.1
# yum install boost-devel
- 安装scons check-devel openssl-devel
# yum install scons check-devel openssl-devel
# yum install libaio # wget https://launchpad.net/codership-mysql/5.5/5.5.29-23.7.3/+download/mysql-5.5.29_wsrep_23.7.3-linux-x86_64.tar.gz # tar zxvf mysql-5.5.29_wsrep_23.7.3-linux-x86_64.tar.gz # # mv mysql-5.5.29_wsrep_23.7.3-linux-x86_64 /usr/local/mysql # cd /usr/local/mysql/ # groupadd mysql # useradd -r -g mysql mysql # chown -R mysql:mysql . # ./scripts/mysql_install_db --no-defaults --datadir=/usr/local/mysql/data --user=mysql # chown -R root . # chown -R mysql data
# wget https://launchpad.net/galera/2.x/23.2.4/+download/galera-23.2.4-src.tar.gz # tar zxvf galera-23.2.4-src.tar.gz # cd galera-23.2.4-src # scons # cp garb/garbd /usr/local/mysql/bin/ # cp libgalera_smm.so /usr/local/mysql/lib/plugin/
# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql # mkdir -p /var/lib/mysql # chown mysql:mysql /var/lib/mysql # vi /etc/my.cnf # cat /etc/my.cnf
[client] port = 3306 socket = /var/lib/mysql/mysql.sock [mysqld_safe] log-error = /var/lib/mysql/mysql.log pid-file = /var/lib/mysql/mysql.pid [mysqld] wsrep_node_name = node1 wsrep_provider = /usr/local/mysql/lib/plugin/libgalera_smm.so #wsrep_provider_options ='gcache.size=1G;socket.ssl_key=my_key;socket.ssl_cert=my_cert' #wsrep_slave_threads=16 wsrep_sst_method = rsync #wsrep_sst_auth=root: port = 3306 socket = /var/lib/mysql/mysql.sock user = mysql basedir = /usr/local/mysql datadir = /usr/local/mysql/data default_storage_engine=InnoDB #innodb_buffer_pool_size=1G #innodb_log_file_size=256M innodb_autoinc_lock_mode=2 innodb_locks_unsafe_for_binlog=1 innodb_flush_log_at_trx_commit=0 innodb_doublewrite=0 innodb_file_per_table=1 binlog_format=ROW log-bin=mysql-bin server-id=101 relay-log=mysql-relay-bin #read_only=1 log-slave-updates=1
[root@G221 ~]# /usr/local/mysql/bin/mysqld_safe --wsrep_cluster_address=gcomm:// >/dev/null &
或
[root@G221 ~]# service mysql start --wsrep_cluster_address=gcomm://
查看mysqld监听的端口:
[root@G221 ~]# netstat -plantu | grep mysqld
tcp 0 0 0.0.0.0:4567 0.0.0.0:* LISTEN 3656/mysqld
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 3656/mysqld
注:
1)”gcomm://”是特殊的地址,仅仅是galera cluster初始化启动时候使用,再次启动的时候需要使用具体的IP地址.
2) 端口4567是wsrep使用的默认端口.该端口的防火墙设置规则应该和3306的一样.
[root@G221 ~]# /usr/local/mysql/bin/mysqladmin -uroot -p shutdown
接入节点G222:
[root@G222 data]# /usr/local/mysql/bin/mysqld_safe --wsrep_cluster_address="gcomm://192.168.1.221:4567,192.168.1.223:4567" >/dev/null &
接入节点G223:
[root@G223 data]# service mysql start --wsrep_cluster_address="gcomm://192.168.1.221:4567,192.168.1.222:4567"
[root@G221 data]# service mysql restart --wsrep_cluster_address="gcomm://192.168.1.222:4567,192.168.1.223:4567" Shutting down MySQL.... SUCCESS! Starting MySQL....... SUCCESS!
2)直接修改MySQL全局变量
mysql> SHOW VARIABLES LIKE 'wsrep_cluster_address';
+-----------------------+----------------------------+
| Variable_name | Value |
+-----------------------+----------------------------+
| wsrep_cluster_address | gcomm://192.168.1.222:4567 |
+-----------------------+----------------------------+
1 row in set (0.00 sec)
mysql> set global wsrep_cluster_address="gcomm://192.168.1.222:4567,192.168.1.223:4567";
Query OK, 0 rows affected (2.20 sec)
mysql> SHOW VARIABLES LIKE 'wsrep_cluster_address';
+-----------------------+-------------------------------------------------------+
| Variable_name | Value |
+-----------------------+-------------------------------------------------------+
| wsrep_cluster_address | gcomm://192.168.1.222:4567,192.168.1.223:4567 |
+-----------------------+-------------------------------------------------------+
1 row in set (0.00 sec)
查看MySQL版本:
mysql> SHOW GLOBAL VARIABLES LIKE 'version'; +---------------+------------+ | Variable_name | Value | +---------------+------------+ | version | 5.5.29-log | +---------------+------------+ 1 row in set (0.00 sec)
查看wsrep版本:
mysql> SHOW GLOBAL STATUS LIKE 'wsrep_provider_version'; +------------------------+------------+ | Variable_name | Value | +------------------------+------------+ | wsrep_provider_version | 2.4(rXXXX) | +------------------------+------------+ 1 row in set (0.00 sec)
mysql> SHOW VARIABLES LIKE 'wsrep_cluster_address'; +-----------------------+-------------------------------------------------------+ | Variable_name | Value | +-----------------------+-------------------------------------------------------+ | wsrep_cluster_address | gcomm://192.168.1.222:4567,192.168.1.223:4567 | +-----------------------+-------------------------------------------------------+ 1 row in set (0.00 sec)
查看Galera集群状态:
mysql> show status like 'wsrep%'; +----------------------------+----------------------------------------------------------+ | Variable_name | Value | +----------------------------+----------------------------------------------------------+ | wsrep_local_state_uuid | 80cdd13d-8cf2-11e2-0800-e0817023b754 | | wsrep_protocol_version | 4 | | wsrep_last_committed | 3 | | wsrep_replicated | 3 | | wsrep_replicated_bytes | 522 | | wsrep_received | 6 | | wsrep_received_bytes | 1134 | | wsrep_local_commits | 1 | | wsrep_local_cert_failures | 0 | | wsrep_local_bf_aborts | 0 | | wsrep_local_replays | 0 | | wsrep_local_send_queue | 0 | | wsrep_local_send_queue_avg | 0.000000 | | wsrep_local_recv_queue | 0 | | wsrep_local_recv_queue_avg | 0.000000 | | wsrep_flow_control_paused | 0.000000 | | wsrep_flow_control_sent | 0 | | wsrep_flow_control_recv | 0 | | wsrep_cert_deps_distance | 1.000000 | | wsrep_apply_oooe | 0.000000 | | wsrep_apply_oool | 0.000000 | | wsrep_apply_window | 1.000000 | | wsrep_commit_oooe | 0.000000 | | wsrep_commit_oool | 0.000000 | | wsrep_commit_window | 1.000000 | | wsrep_local_state | 4 | | wsrep_local_state_comment | Synced | | wsrep_cert_index_size | 5 | | wsrep_causal_reads | 0 | | wsrep_incoming_addresses | 192.168.1.221:3306,192.168.1.222:3306,192.168.1.223:3306 | | wsrep_cluster_conf_id | 13 | | wsrep_cluster_size | 3 | | wsrep_cluster_state_uuid | 80cdd13d-8cf2-11e2-0800-e0817023b754 | | wsrep_cluster_status | Primary | | wsrep_connected | ON | | wsrep_local_index | 0 | | wsrep_provider_name | Galera | | wsrep_provider_vendor | Codership Oy| | wsrep_provider_version | 2.4(rXXXX) | | wsrep_ready | ON | +----------------------------+----------------------------------------------------------+ 40 rows in set (0.00 sec)
最慢的节点的wsrep_flow_control_sent和wsrep_local_recv_queue_avg这两个值最高.这两个值较低的话,相对更好.
garbd可以做为一个无数据的Galera节点运行,该节点可以用一种优化的方式帮助检测和处理网络分裂(network splits).
一个好的garbd节点可以防止”split-brain”状况发生.
Galera支持SSL通讯,这对增加数据安全性很重要(特别是云部署).可以通过参数socket.ssl_cert和socket.ssl_key来定义.
SST允许新接入的节点使用定制的方法来获取最初的数据.SST方式有mysqldump(默认,比较慢),rsync,和xtrabackup(很快).
可通过wsrep_sst_method来定义.Production环境中建议使用rsync或是xtrabackup方式.