赞
踩
在生产环境中mysql的高可用的对于整个项目而言有着至关重要的作用。因此需要将mysql设计成为高可用的架构。本博文将详细介绍的mysql+keepalived构建的mysql互为主从的架构实战。
操作系统 | centos7.0 |
数据库 | mysql5.7 |
master 安装mysql 和keeplived | 192.168.128 |
slave 安装mysql 和keeplived | 192.168.140 |
docker 安装 | docker 最新版本 |
虚拟IP地址 | 192.168.150 |
要实现互为主从,就必须 mster1-->master2设置主从同步 同时 master2--->master1 也设置主从同步。
vi /etc/my.cnf
- vi /etc/my.cnf
- [mysqld]
-
- #全局唯一,每台都不能一样
- server-id = 1
-
- #log-bin表示开启二进制日志记录,mysql-bin表示日志文件的命名格式,会生成mysql-bin.0001 等等
- log-bin = mysql-bin
-
- #指定中继日志格式(拉取主mysql日志后,在从库上生成的日志)
- relay-log = mysql-relay-bin
-
- #指定那些库或则表不进行同步,mysql是库名,.%表示下面所有的表,mysql.user 表示不同不mysql库下的user表
- replicate-wild-ignore-table=mysql.%
- replicate-wild-ignore-table=test.%
- replicate-wild-ignore-table=information_schema.%
-
- #replicate-wild-do-table=boke.% #表示同步那个库
- #注意:不要在主库上使用binlog-do-db 或 binlog-ignore-db选项
- #也不要在从库上使用 replicate-do-db 或 replicate-ignore-db 选项,因为这有可能产生跨库更新失败的问题.推荐从库上使用 replicate_wild_do_table 和 replicate_wild_ignore_table 这两个选项来解决复制过滤问题
- datadir=/data/mysql
- socket=/data/mysql/mysql.sock
- user=mysql
- symbolic-links=0
- log-error=/var/log/mysqld.log
- pid-file=/var/run/mysqld/mysqld.pid
- character-set-server=utf8
-
- [mysql]
- socket=/data/mysql/mysql.sock
- default-character-set=utf8
-
- [client]
- socket=/data/mysql/mysql.sock
- default-character-set=utf8
- user=root
- password=root
- #若是不写上这个字段,在本机用命令进入mysql会报错,提示默认路径/var/lib/mysql/mysql.sock找不到
vi /etc/my.cnf
- vi /etc/my.cnf
- [mysqld]
-
- server-id = 2
-
- log-bin = mysql-bin
-
- relay-log = mysql-relay-bin
-
- replicate-wild-ignore-table=mysql.%
- replicate-wild-ignore-table=test.%
- replicate-wild-ignore-table=information_schema.%
-
- datadir=/data/mysql
- socket=/data/mysql/mysql.sock
- user=mysql
- symbolic-links=0
- log-error=/var/log/mysqld.log
- pid-file=/var/run/mysqld/mysqld.pid
- character-set-server=utf8
-
- [mysql]
- socket=/data/mysql/mysql.sock
- default-character-set=utf8
-
- [client]
- socket=/data/mysql/mysql.sock
- default-character-set=utf8
-
- user=root
- password=root
- #mysql5.7.7以后的初始化方法
- mysqld --initialize --user=mysql --datadir=/data/mysql
-
- #mysql5.7.7以前的初始化方法
- mysql_install_db --user=mysql --datadir=/data/mysql
-
- #分别启动主从数据库
- #在centos7里面,必须先关闭selinux,否在无法启动mysqld
- systemctl start mysqld
-
- # 分别为主从mysql做安全加固
- #查到上一步,首次启动mysql,系统自动生成的密码( cat /var/log/mysqld.log |grep pass )
-
- mysql_secure_installation #使用该命令更改随机root密码(修改为 NCYD-tianyu@0791 )
-
- 手动同步数据(假如现在的环境,主上已经有数据了,从是新的)
- 1:在主上数据库中创建用于复制的用户,并授权
- mysql> GRANT REPLICATION SLAVE ON *.* to 'tongbu'@'192.168.1.43' identified by '123456789';
-
- 2:在主mysql上先锁表(使其所有表变成只读状态)
- mysql> flush tables with read lock; #不要退出终端,否在这个锁就失效了
-
- 3:再开启另一个命令行终端,使用myqldump等工具将数据导出(或则直接打包存储mysql数据的目录,并发送到从机上)
-
- 4:将导出数据复制到从机上,并创建新库并导入数据
-
- 互相置从,互相置主(以达到双主模式)
mysqlMaster上将mysqlSlave设置为自己的主角色服务器
- mysql> show master status; #查看mysqlSlave的状态(记录File名字,和Position)
- change master to
- master_host = '192.168.25.140',
- master_user = 'root',
- master_password = 'root',
- master_log_file = 'mysql-bin.000002',
- master_log_pos = 1006;
-
- mysql> start slave; #启动slave端的复制进程(某些版本是:slave start; )
- mysql> show slave status\G #查看slaves端的I/O进程,与SQL进程
在从上将mysqlMaster设置为自己的主角色服务器
- mysql> show master status; #查看mysqlMaster的状态(记录File名字,和Position)
- change master to
- master_host = '192.168.25.128',
- master_user = 'root',
- master_password = 'root',
- master_log_file = 'mysql-bin.000002',
- master_log_pos = 1006;
-
- mysql> start slave; #启动slave端的复制进程
- mysql> show slave status\G #查看slaves端的I/O进程,与SQL进程
1:第一验证在myssqlMaster上创建库,mysqlSlave上是否存在。
2:第二验证在mysqlSlave上创建库,mysqlMaster上是否存在。
### 配置主节点 ### 找到140注解keepalived的配置文件keepalived.conf global_defs { router_id 192.168.25.140 script_user root enable_script_security } vrrp_script chk_nginx { script "/etc/keepalived/check_mysql.sh" interval 2 weight -20 } vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 140 mcast_src_ip 192.168.25.140 priority 100 nopreempt advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { 192.168.25.150 } }
### 配置从节点 ### 找到128注解keepalived的配置文件keepalived.conf global_defs { router_id 192.168.25.128 script_user root enable_script_security } vrrp_script chk_nginx { script "/etc/keepalived/check_mysql.sh" interval 2 weight -20 } vrrp_instance VI_1 { state BACKUP interface eth2 virtual_router_id 140 priority 90 mcast_src_ip 192.168.25.128 advert_int 1 authentication { auth_type PASS auth_pass 1111 } track_script { chk_nginx } virtual_ipaddress { 192.168.25.150 } }
mysql5.7
- #!/bin/bash
-
- counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
- if [ "${counter}" -eq 0 ]; then
- /etc/init.d/keepalived stop
- fi
mysql5.8
- #!/bin/bash
- #slave_is=( $(mysql -uroot -pNCYD-tianyu@0791 -e "show slave status\G" | grep "Slave_.*_Running" | awk '{print $2}') ) 在新版本的myql中,直接将密码写在命令行,会进行安全提示,解决办法是将其写在mysql的配置文件里的 [client] 字段里,写法见上面mysql的配置文件
- slave_is=( $(mysql -e "show slave status\G" | grep "Slave_.*_Running" | awk '{print $2}') )
- if [ "${slave_is[0]}" = "Yes" -a "$slave_is[1]" = "Yes"]
- then
- exit 0
- else
- exit 1
- fi
- # 赋予权限
-
- chmod +x /etc/keepalived/mysql_check.sh
-
- # 启动keeplived
-
- sudo service keepalived start
-
- # 查看keeplived
-
- sudo service keepalived status
-
- # 停止keeplived
-
- sudo service keepalived stop
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。