MYSQL双主配置
一、为什么MYSQL要做双主?
这样做可以在一定程度上保证主库的高可用,在一台主库down掉之后,可以在极短的时间内切换到另一台主库上(尽可能减少主库宕机对业务造成的影响),减少了主从同步给线上主库带来的压力。
二、双主的思路
搭配keepalived进行使用。keepalived在实际的物理地址的基础上虚化的一个地址(VIP)。对外连接使用的便是这个浮动地址。在一台主机宕机后,这个浮动地址会跑到另外的地址上面。
mysql双主:指的是两台mysql(masterA&masterB)均可读写,互为主备。两者数据相互同步。通过keepalived对面的浮动地址便可实现高可用。
缺点也比较明显:一台mysql只负责同步数据(比较空闲),可能存在时延问题。
示意图
二、安装步骤
本教程采用mysql5.7,安装方式为rpm安装。
1、查询是否有安装旧版本mysql
。
rpm -qa|grep mysql
如果有,请卸载。使用命令:
rpm -e mysql-***************
#卸载报错,跳过依赖检查。使用
rpm -e mysql-**** --nodeps
#记得也卸载掉mariadb
rpm -qa|grep mariadb
rpm -e mariadb-* --nodeps
2、解压tar包
tar -xvf mysql-------.tar
3、以此安装mysql相关rpm包。注意版本
rpm -ivh mysql-community-common-5.7.20-1.el6.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.20-1.el6.x86_64.rpm
rpm -ivh mysql-community-client-5.7.20-1.el6.x86_64.rpm
rpm -ivh mysql-community-server-5.7.20-1.el6.x86_64.rpm
ps:需要mysql开发环境的记得安装mysql-community-devel
4、启动mysql,查看密码,登录mysql。
service mysqld start
#查看密码,一串字符的东西
grep 'temporary password' /var/log/mysqld.log
#默认root用户
mysql -uroot -p
5、修改密码、修改密码复杂度、创建用户。
#修改密码复杂度
set global validate_password_policy=0;
set global validate_password_length=1;
#修改密码
set password = password('abcd@test2021');
#创建用户并赋予权限
GRANT ALL PRIVILEGES ON *.* TO 'abcd'@'%' IDENTIFIED BY 'abcd@test2021';
#创建同步用户
GRANT ALL PRIVILEGES ON *.* TO 'slave_sync'@'%'IDENTIFIED BY 'slave@test2021';
#刷新配置
flush privileges;
#退出数据库
exit
6、修改数据库存储目录
#设置开机启动
chkconfig mysqld on
#停止mysql
service mysqld stop
#关闭防火墙
systemctl stop firewalld.service
#永久关闭防火墙
systemctl disable firewalld.service
#关闭IP tables
iptables -F
#修改selinux
vi /etc/selinux/config
#修改为下面的,并保存
SELINUX=disabled
#及时生效
setenforce 0
#创建新的mysql数据存储目录
mkdir -p /data/mysql_data
#复制MySQL的相关文件,不建议mv。带上-rp 保证权限不变。
cp -rp /var/lib/mysql /data/mysql_data
#修改mysql配置文件
vi /etc/my.cnf
我放了一份我的配置文件在下面:
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
#datadir=/var/lib/mysql
#socket=/var/lib/mysql/mysql.sock
datadir=/data/mysql_data/mysql
socket=/data/mysql_data/mysql/mysql.sock
character-set-server=utf8
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
max_connections=1000
server-id=19 #server的唯一标识(2台主机不同)
log-bin = mysql-bin #打开二进制功能,MASTER主服务器必须打开此项
replicate-ignore-db = mysql #忽略不同步主从的数据库
replicate-ignore-db = information_schema
auto_increment_offset=1 #自增id起始值
auto_increment_increment=2 #每次自增数字
binlog_format=mixed # 主从复制的格式(mixed,statement,row,默认格式是 statement)
#max_binlog_size=1024M #binlog单文件最大值
binlog_checksum = none #跳过现有的采用checksum的事件,mysql5.6.5以后的版本中binlog_checksum=crc32,而低版本都l是binog_checksum=none
slave-skip-errors = all #跳过主从复制中遇到的所有错误或指定类型的错误,避免 slave 端复制中断
expire_logs_days=0 # 二进制日志自动删除/过期的天数。默认值为 0,表示不自动删除。
sync_binlog = 1 #确保binlog日志写入后与硬盘同步
port=3306
[client]
default-character-set=utf8
socket=/data/mysql_data/mysql/mysql.sock
7、双主同步设置
#启动mysql
service mysqld start
#登录mysql
mysql -uroot -pabcd@test2021
#在另外一台mysql上查看偏移量mysql-bin
show master status;
#master A的数据为master B的相关参数,如果是master B则是master B的参数
change master to master_host='192.168.3.3',master_user='salve_sync', master_password='slave@test2021', master_port=3306, master_log_file='mysql-bin.000001'
#开始同步
start slave;
#查看同步状态
show slave status\G
8、将1-7步骤在master B也做一次
#查看同步状态
show slave status\G
出现以下东西mysql状态正常
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
9、测试
在master A上创建一个数据库:
#创建数据库
create database mydb;
#创建数据表
use mydb;
#创建表
create table test
(
id int,
name varchar(255),
)
在masterB上面查看
#查看数据库
show databases;
#查看表
use mydb;
show tables;
#删除表
drop table test;
#这时master A上面应该没有test表了。
#删除库
drop database mydb;
#这时master A上面应该没有mydb库了。
mysql双主完成。
附录
mysql启动方式
#一、启动方式
#1、使用linux命令service 启动:
service mysqld start
#2、使用 mysqld 脚本启动:
/etc/inint.d/mysqld start
#3、使用 safe_mysqld 启动:
safe_mysqld&
#二、停止
#1、使用 service 启动:
service mysqld stop
#2、使用 mysqld 脚本启动:
/etc/inint.d/mysqld stop
#3、 mysqladmin shutdown
#三、重启
#1、使用 service 启动:
service mysqld restart
#2、使用 mysqld 脚本启动:
/etc/inint.d/mysqld restart
#备注:查看mysql端口是否已经使用,使用netstat -anp 命令查看服务器端口使用情况。
#第二部分,linux下重启mysql数据库的各种方法
#1、通过rpm包安装的MySQL
#代码示例:
service mysqld restart
/etc/inint.d/mysqld start
#2、从源码包安装的MySQL
#代码示例:
#// linux关闭MySQL的命令
$mysql_dir/bin/mysqladmin -uroot -p shutdown
#// linux启动MySQL的命令
$mysql_dir/bin/mysqld_safe &
#其中mysql_dir为MySQL的安装目录,mysqladmin和mysqld_safe位于MySQL安装目录的bin目录下。
#3、以上方法都无效时,通过强行命令:
#代码示例:
killall mysqld #关闭mysql