简介
Percona-XtraDB-Cluster是 MySQL 集群的一个主主复制的解决方案,暂时也只了解了这一个,搭配 HaProxy 负载均衡,自己用起来感觉效果不错。简单介绍一下其特点:
-
强一致性,所有服务器提交的事务全部执行完,才算执行成功;
-
只支持 InnoDB 引擎;
-
所有服务器的配置都要相同,因为同步速度取决于配置最低的服务器;
-
多主复制,可以在任一节点写入,可以很方便地做负载均衡;
-
数据库过多的话会影响同步速度;
介绍完 PXC,再简单说一下 Replication 的特点:
- 弱一致性,异步复制,无法保证数据一致性;
- 同步复制快;
- 适合存储低价值的数据;
部署
卸载 Mariadb-libs
yum -y remove mari*
为什么要卸载 Mariadb 呢?因为 Mariadb 是 MySQL 的一个分支,而 CentOS7 默认安装了它,这时在安装 MySQL 时会产生冲突,所以要先卸载掉它。
开放端口
- 3306:MySQL 服务端口
- 4444:全量同步端口
- 4567:数据库节点通信端口
- 4568:增量同步端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=4444/tcp --permanent
firewall-cmd --zone=public --add-port=4567/tcp --permanent
firewall-cmd --zone=public --add-port=4568/tcp --permanent
firewall-cmd --reload
关闭SELINUX
vi /etc/selinux/config
#将 SELINUX 参数改为 disabled
SELINUX = disabled
SELINUX 涉及到权限控制方面的东西,目前对它还不是很了解,为了避免出现不必要的问题,先关掉它。
安装 Percona-XtraDB-Cluster
yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm
yum update -y percona-release
yum install -y Percona-XtraDB-Cluster-57
修改 MySQL 配置文件
初始化 Root 密码并创建同步账户
cat /var/log/mysqld.log | grep "A temporary password"
mysql -u root -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'root';
CREATE USER 'admin'@'%' IDENTIFIED BY 'admin';
GRANT all privileges ON *.* TO 'admin'@'%';
FLUSH PRIVILEGES;
exit;
关闭 MySQL 并禁止开机启动
service mysql stop
chkconfig mysqld off
这里之所以禁止 MySQL 开机启动,是因为后续会用到其他启动命令。
修改 Wsrep 配置文件
编辑配置文件
vi /etc/my.cnf
替换并修改参数
[client]
socket=/var/lib/mysql/mysql.sock
[mysqld]
server-id=3 #当前集群服务器 id ,注意不要跟其他服务器 id 冲突
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log-bin
log_slave_updates
expire_logs_days=7
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
character_set_server = utf8
bind-address = 0.0.0.0
#跳过DNS解析
skip-name-resolve
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_name=pxc-cluster #PXC集群的名称
wsrep_cluster_address=gcomm://192.168.1.161,192.168.1.199,192.168.1.139 #所有集群的IP
wsrep_node_name=pxc3 #当前节点的名称
wsrep_node_address=192.168.1.199 #当前节点的IP
wsrep_sst_method=xtrabackup-v2 #同步方法(mysqldump、rsync、xtrabackup)
wsrep_sst_auth= admin:admin #同步使用的帐户,这里就是上面创建的同步账户
pxc_strict_mode=ENFORCING #同步严厉模式
binlog_format=ROW #基于ROW复制(安全可靠)
default_storage_engine=InnoDB #默认引擎
innodb_autoinc_lock_mode=2 #主键自增长不锁表
初始化集群节点
其中一个节点使用 systemctl start mysql@bootstrap.service 启动,其他节点使用 service mysql start 启动
管理命令
systemctl stop mysql@bootstrap.service
systemctl start mysql@bootstrap.service
systemctl stop mysqld
systemctl start mysqld
配置 wsrep_causal_reads
mysql -u root -p
set wsrep_causal_reads =1;
为什么要修改 wsrep_causal_reads 参数呢?因为集群内 master 节点的性能更好,执行事件要比 slave 快,这就造成了短暂的同步不一致(out-of-sync),这时候读取 slave 结果就为空,wsrep_causal_reads 参数用来控制读取 slave 的行为,它会使操作一直等待直到事件被执行;
查看 PXC 集群状态
mysql -u root -p
show status like 'wsrep_cluster%';
使用 HaProxy 做负载均衡
安装 haproxy
yum install -y haproxy
修改配置
vi /etc/haproxy/haproxy.cfg
替换并修改参数
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
listen admin_stats
bind 0.0.0.0:8888
mode http
stats uri /dbs
stats realm Global\ statistics
stats auth admin:admin
listen proxy-mysql
bind 0.0.0.0:3306
mode tcp
balance roundrobin
option tcplog #日志格式
server MySQL_1 192.168.1.161:3306 check weight 1 maxconn 2000 #这里注意将IP修改为集群服务器的IP
server MySQL_2 192.168.1.139:3306 check weight 1 maxconn 2000
server MySQL_3 192.168.1.199:3306 check weight 1 maxconn 2000
#option tcpka #使用keepalive检测死链
重启服务
service haproxy start
通过访问 http://localhost:8888/dbs 即可查看 HaProxy 运行状态。用户名和密码为 admin,端口、后缀和账户都可在配置文件内进行修改。
结束
暂时先写到这里,等待后续更新。