MySQL高可用搭建

测试环境 安装数据库 wget http://dev.mysql.com/get/mysql57‐community‐release‐el7‐8.noarch.rpm yum localinstall mysql57‐community‐release‐el7‐8.noarch.rpm ‐y

检查是否安装成功

yum repolist enabled | grep “mysql.‐community.

安装mysql

yum install mysql‐community‐server ‐y

启动mysql

systemctl start mysqld systemctl status mysqld

开机启动

systemctl enable mysqld systemctl daemon‐reload

获取临时密码

grep ‘temporary password’ /var/log/mysqld.log

修改密码 包含大小写字母、数字和特殊符号,并且长度不能少于8位

mysql ‐uroot ‐p ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘Mastar@1994’;

允许root用户远程登录

GRANT ALL PRIVILEGES ON . TO ‘root’@’%’ IDENTIFIED BY ‘Mastar@1994’ WITH GRANT OPTION;

修改编码

vi /etc/my.cnf [mysqld] character_set_server=utf8 init_connect=’SET NAMES utf8’

重启数据库

systemctl restart mysqld

登录数据库 查看编码

mysql ‐uroot ‐pMastar@1994 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 默认配置文件路径: 配置文件:/etc/my.cnf 日志文件:/var/log/mysqld.log 服务启动脚本:/usr/lib/systemd/system/mysqld.service socket文件:/var/run/mysqld/mysqld.pid master_ip 10.246.250.224 slave_ip 10.246.250.225 VIP 10.246.250.250 配置主主数据同步 1、安全配置 2、master节点配置(10.246.250.224) 2.1、添加数据同步配置 show variables like ‘%character%’; systemctl stop firewalld setenforce 0 vi /etc/selinux/config SELINUX=disabled vi /etc/my.cnf

服务器的ID,必须唯一,一般设置自己的IP

server_id=224 # 下面slave节点server_id与此不一致

复制过滤:不需要备份的数据库(MySQL库一般不同步)

binlog‐ignore‐db=mysql

开启二进制日志功能,名字可以随便取,最好有含义(比如项目名)

log‐bin=skiff‐mysql‐bin

为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存

29 1 2 3 4 1 2 3 4 5 6 7 8 2.2、master配置 2.3、slave配置 binlog_cache_size=1M

主从复制的格式(mixed,statement,row,默认格式是 statement)

binlog_format=mixed

二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。

expire_logs_days=7

跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中

断。

如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一致

slave_skip_errors=1062

作为从服务器时的中继日志

relay_log=skiff‐mysql‐relay‐bin

log_slave_updates 表示 slave 将复制事件写进自己的二进制日志

log_slave_updates=1

主键自增规则,避免主从同步ID重复的问题

auto_increment_increment=2 # 自增因子(每次加2) auto_increment_offset=1 # 自增偏移(从1开始),单数 systemctl restart mysqld mysql ‐uroot ‐pMastar@1994 grant replication slave, replication client on . to ‘repl’@’10.246.250.225’ identified by ‘Mastar@1994’; flush privileges;

查看binlog文件的position(偏移)和File(日志文件)的值,从机上需要

用到 show master status;

master_user和master_password:在225’上执行grant replication

slave…创建的用户和密码

master_log_file和master_log_pos:在225上运行show master status;

命令执行结果对应File和Position字段的值 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 1 2 3 4 5 6 1 2 3、slave节点配置(10.246.250.225) 3.1、添加数据同步配置 change master to master_host=’10.246.250.225’,master_user=’repl’, master_password=’Mastar@1994’, master_port=3306, master_log_file=’skiff‐mysql‐bin.000002’, master_log_pos=632, master_connect_retry=30; start slave; show slave status\G;

Slave_IO_Running: Yes Slave_SQL_Running: Yes 这两个选项是YES时

说明正常 vi /etc/my.cnf

服务器的ID,必须唯一,一般设置自己的IP

server_id=225

复制过滤:不需要备份的数据库(MySQL库一般不同步)

binlog‐ignore‐db=mysql

开启二进制日志功能,名字可以随便取,最好有含义(比如项目名)

log‐bin=skiff‐mysql‐bin

为每个 session 分配的内存,在事务过程中用来存储二进制日志的缓存

binlog_cache_size=1M

主从复制的格式(mixed,statement,row,默认格式是 statement)

binlog_format=mixed

二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。

expire_logs_days=7

跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中

断。

如:1062 错误是指一些主键重复,1032 错误是因为主从数据库数据不一致

slave_skip_errors=1062

作为从服务器时的中继日志

relay_log=skiff‐mysql‐relay‐bin

log_slave_updates 表示 slave 将复制事件写进自己的二进制日志

log_slave_updates=1

主键自增规则,避免主从同步ID重复的问题

auto_increment_increment=2 # 自增因子(每次加2) auto_increment_offset=1 # 自增偏移(从1开始),单数 3 4 5 6 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 3.2、master配置 3.3、slave配置 4、验证 systemctl restart mysqld mysql ‐uroot ‐pMastar@1994 grant replication slave, replication client on . to ‘repl’@’10.246.250.224’ identified by ‘Mastar@1994’; flush privileges;

查看binlog文件的position(偏移)和File(日志文件)的值,从机上需要

用到 show master status;

Slave_IO_Running: Yes Slave_SQL_Running: Yes 这两个选项是YES时

说明正常

master_user和master_password:在224上执行grant replication

slave…创建的用户和密码

master_log_file和master_log_pos:在224上运行show master status;

命令执行结果对应File和Position字段的值 change master to master_host=’10.246.250.224’,master_user=’repl’, master_password=’Mastar@1994’, master_port=3306, master_log_file=’skiff‐mysql‐bin.000002’, master_log_pos=632, master_connect_retry=30; start slave; show slave status\G;

登录224创建一个数据库

shell> mysql ‐u root ‐p mysql> create database if not exists mydb default character set utf8 collate utf8_general_ci; mysql>use mydb; mysql> create table user (id int, username varchar(30), password varchar(30)); 1 2 3 4 5 6 7 1 2 3 4 5 1 2 3 4 5 安装keepalived 修改配置文件 mysql> insert into user values (1, ‘mmx’, ‘123456’);

下面是在225节点上的操作

#1、登录225查询所有库,是否包含mydb数据库 #2、切换到mydb库,是否包含user表,并有一条数据 #3、在225的mydb.user表插入一条数据,查看是否同步过去 mysql> insert into user values (2,’mmx1’,’123456’); yum ‐y install keepalived

开机启动

systemctl enable keepalived vi /etc/keepalived/keepalived.conf global_defs { } v rrp_instance VI_1 { state BACKUP interface enp0s3 virtual_router_id 51 priority 100 # 从节点配置90 nopreempt # 主节点配置,从节点不用配置 advert_int 1 authentication { auth_type PASS auth_pass 1111 } v irtual_ipaddress { 10.246.250.250 } } v irtual_server 10.246.250.250 3306 { delay_loop 6 6 7 8 9 10 11 1 2 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 添加脚本 lb_algo rr lb_kind NAT persistence_timeout 50 protocol TCP real_server 10.246.250.224 3306 { # 从节点配置时换成从节点IP weight 1 notify_down /usr/local/keepalived/mysql.sh TCP_CHECK { connect_timeout 3 nb_get_retry 3 delay_before_retry 3 } } } m kdir /usr/local/keepalived/ vi /usr/local/keepalived/mysql.sh #!/bin/bash pkill keepalived chmod +x /usr/local/keepalived/mysql.sh systemctl restart keepalived 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 1 2 3 4 5 6