MySQL/Galera是MySQL/InnoDB的多主集群,有以下特性: - 同步复制 - Active-active的多主拓扑结构 - 集群任意节点可以读和写 - 自动身份控制,失败节点自动脱离集群 - 自动节点接入 - 真正的基于”行”级别和ID检查的并行复制 - 无单点故障,易扩展
主机名 | IP地址 | MGR角色 |
mgr001 | 192.168.80.232 | primary |
mgr002 | 192.168.80.231 | primary |
mgr003 | 192.168.80.230 | primary |
确认安装有gcc和gcc-c++
# yum install gcc gcc-c++
确认安装有boost-devel rsync lsof
# yum install boost-devel
安装scons check-devel openssl-devel
# yum install scons check-devel openssl-devel
创建用户组
# groupadd mysql
添加用户并加入组
# useradd -g mysql -M mysql
设置用户密码
# passwd mysql
新建mysql数据目录,日志目录,临时目录
# mkdir -p /ops/mysql-galera/{data,logs,temp}
设置mysql的basedir目录权限
# chown -R mysql:mysql /ops/mysql-galera
切换至mysql用户
# su - mysql
http://releases.galeracluster.com//galera-3/source/galera-3-25.3.25.tar.gz
http://releases.galeracluster.com//mysql-wsrep-5.7/binary/mysql-wsrep-5.7.24-25.16-linux-x86_64.tar.gz
解压带有wsrep patch的mysql
# cd /home/mysql/sorftware
# tar zxf mysql-wsrep-5.7.24-25.16-linux-x86_64.tar.gz -C /ops/mysql-galera/
重命名
# cd /ops/mysql-galera
# mv mysql-wsrep-5.7.24-25.16-linux-x86_64/ mysql-wsrep-5.7.24
# cd /home/mysql/sorftware
# tar zxf galera-3-25.3.25.tar.gz -C /ops/mysql-galera/
# mv galera-3-25.3.25/ galera-3.25
# cd galera-3.25/
# scons
# cp -f garb/garbd /ops/mysql-gelera/mysql-wsrep-5.7.24/bin/
# cp -f libgalera_smm.so /ops/mysql-gelera/mysql-wsrep-5.7.24/lib/plugin/
# rm -f /etc/my.cnf
# touch /etc/my.cnf.d/wsrep.cnf
# cat < /etc/my.cnf
[client]
port=36806
socket=/ops/mysql-gelera/mysql.sock
[mysqldump]
quick
max_allowed_packet=32M
[mysqld_safe]
log-error=/ops/mysql-gelera/logs/mysqld.log
pid-file=/ops/mysql-gelera/mysqld.pid
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
log-bin-trust-function-creators=1
skip-external-locking
skip-name-resolve=1
user=mysql
port=36806
basedir=/ops/mysql-gelera/mysql-wsrep-5.7.24
datadir=/ops/mysql-gelera/data
tmpdir=/ops/mysql-gelera/temp
socket=/ops/mysql-gelera/mysql.sock
log-error=/ops/mysql-gelera/logs/mysql_error.log
pid-file=/ops/mysql-gelera/mysqld.pid
slow-query-log-file=/ops/mysql-gelera/logs/mysql-slow.log
server_id=3
log_bin=mysql-bin
relay-log=mgc003-relay-bin
binlog_format=row
#auto_increment_increment=2
#auto_increment_offset=1
open_files_limit=10240
back_log=600
max_connections=500
max_connect_errors=6000
wait_timeout=605800
max_allowed_packet=32M
sort_buffer_size=4M
join_buffer_size=4M
thread_cache_size=300
query_cache_type=1
query_cache_size=256M
query_cache_limit=2M
query_cache_min_res_unit=16k
tmp_table_size=256M
max_heap_table_size=256M
key_buffer_size=256M
read_buffer_size=1M
read_rnd_buffer_size=16M
bulk_insert_buffer_size=64M
lower_case_table_names=1
default-storage-engine=INNODB
innodb_buffer_pool_size=2G
innodb_log_buffer_size=32M
innodb_log_file_size=128M
innodb_flush_method=O_DIRECT
long_query_time=2
slow-query-log=on
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
!includedir /etc/my.cnf.d
EOF
wsrep配置文件wsrep.cnf
# cat < /etc/my.cnf.d/wsrep.cnf
[mysqld]
wsrep_provider=/ops/mysql-gelera/mysql-wsrep-5.7.24/lib/plugin/libgalera_smm.so
wsrep_cluster_name="galera_cluster"
wsrep_cluster_address="gcomm://192.168.80.232,192.168.80.231,192.168.80.230"
#wsrep_provider_options ='gcache.size=1G;socket.ssl_key=my_key;socket.ssl_cert=my_cert'
wsrep_node_name=mgr003
wsrep_node_address='192.168.80.230'
wsrep_sst_donor='mgr003,mgr002,mgr001'
wsrep_slave_threads=1
wsrep_certify_nonPK=1
wsrep_max_ws_rows=131072
wsrep_max_ws_size=1073741824
wsrep_debug=0
wsrep_convert_LOCK_to_trx=0
wsrep_retry_autocommit=1
wsrep_auto_increment_control=2
wsrep_drupal_282555_workaround=0
wsrep_causal_reads=0
#wsrep_notify_cmd=
wsrep_sst_method=rsync
#awsrep_sst_auth=root:
EOF
# /ops/mysql-galera/mysql-wsrep-5.7.24/bin/mysqld_safe --wsrep_cluster_address=gcomm:// >/dev/null &
# ss -tunpl|grep mysqld
# /ops/mysql-galera/mysql-wsrep-5.7.24/bin/mysqladmin -uroot -p shutdown
在集群停止之后重启时,先在每个节点上使用mysqld_safe --wsrep-recover查看节点的Recovered position的值,选择值最大的一个作为第一个节点启动,如果启动失败,则在将作为第一个启动节点的服务器上编辑grastate.dat文件(可以使用find命令查找位置),将safe_to_bootstrap的值设为1,使用/usr/bin/mysqld_bootstrap命令启动该节点,其他节点启动与以前一致
注意:
"gcomm://" 是特殊的地址,仅仅是Galera cluster初始化启动时候使用。如果集群启动以后,节点有变化,再次启动的时候必须先修改
"gcomm://"为其他节点的集群地址,对应各节点的hostname或者dns名称
启动第一个节点的时候,"gcomm://"为空值,不指定任何机器
设置第二个节点的时候,指定第一个节点的IP"gcomm://192.168.80.230"
设置第三个节点的时候,指定第一和第二节点的IP:"gcomm://192.168.80.230,192.168.80.231"
wsrep_node_name 本节点计算机名
wsrep_node_address 本节点IP
第二个节点加入,地址写第一个节点地址
# /ops/mysql-galera/mysql-wsrep-5.7.24/bin/mysqld_safe --wsrep_cluster_address=gcomm://192.168.80.230 >/dev/null &
第三个节点加入,地址写第一个和第二个节点地址
# /ops/mysql-galera/mysql-wsrep-5.7.24/bin/mysqld_safe --wsrep_cluster_address=gcomm://192.168.80.230,192.168.80.231 >/dev/null &
查看mysql版本
mysql> SHOW GLOBAL VARIABLES LIKE 'version';
查看wsrep版本
mysql> SHOW GLOBAL STATUS LIKE 'wsrep_provider_version';
查看集群地址
mysql> SHOW VARIABLES LIKE 'wsrep_cluster_address';
查看Galera集群状态
mysql> show status like 'wsrep%';
最慢的节点的wsrep_flow_control_sent和wsrep_local_recv_queue_avg这两个值最高.这两个值较低的话,相对更好.
garbd可以做为一个无数据的Galera节点运行,该节点可以用一种优化的方式帮助检测和处理网络分裂(network splits).
一个好的garbd节点可以防止”split-brain”状况发生.
SSL支持
Galera支持SSL通讯,这对增加数据安全性很重要(特别是云部署).可以通过参数socket.ssl_cert和socket.ssl_key来定义.
SST方式选择
SST允许新接入的节点使用定制的方法来获取最初的数据.SST方式有mysqldump(默认,比较慢),rsync,和xtrabackup(很快).
可通过wsrep_sst_method来定义.Production环境中建议使用rsync或是xtrabackup方式