mysql主主备份原理:
复制过程中一个服务器充当主服务器,另一个或多个充当从服务器,主服务器将更新写入二进制日志,并维护日志文件的一个索引以跟中日志循环。当一个从服务器连接到主服务器时,它通知主服务器上次更新的位置,从服务器就接收主服务器从那时起发生的变更,然后封锁并等待主服务器通知下一次更新。
双主热备原理:
MySQL都对外提供服务。但是当一台MySQL宕机后,另一台会马上接管宕机的MySQL的访问。当宕机的MySQL修好了之后又对重新将业务还给他
一、编译安装mysql5.7.20
1、卸载系统自带的Mariadb数据库
rrpm -qa |grep mariadb (不卸载后面启动mysql的时候会报错)
2、创建mysql用户组和mysql用户
groupadd mysql
useradd -g mysql mysql
/3、解压mysql-5.7.20
tar zxvf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
/4、创建data目录并将解压后的安装包移动到/data目录下重命名为mysql
mv mysql-5.7.20-linux-glibc2.12-x86_64 /usr/local/mysql
/5、修改属主,属组
cd /data
chown -R mysql.mysql mysql
/6、创建data目录,作为数据库存储位置
mkdir /usr/local/mysql/data
7、初始化mysql
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql--datadir=/usr/local/mysql/data
如果报错 可以先检查/etc/my.cnf中的datadir的路径是否是MySQL的安装数据路径
8、安装的之后记得记下mysql的初始密码:2018-06-07T06:40:13.310635Z 1 [Note] A temporary password is generated for root@localhost: gq+8i+jxQJ9>
9、启动mysql
/data/mysql/bin/mysqld_safe --user=mysql &
10、登录并修改密码
/usr/local/mysql/bin/mysql -uroot -p
/usr/local/mysql/bin/mysqladmin -uroot -p password
11、设置开机自启
cp /data/mysql/support-files/mysql.server /etc/rc.d/init.d/mysql
chmod +x /etc/rc.d/init.d/mysql
chkconfig mysqld --add
启动的时候会报239的错,这是因为mysql默认安装在在/usr/local目录下,如果安装在/usr/local目录下则会正常启动和关闭,不会报错。但是本次安装在自定义的/data目录下,此时需要修改/etc/init.d/mysqld文件,保存后退出
vim /etc/init.d/mysqld
basedir=/data/mysql
datadir=/data/mysql/data
二、编译安装keepalived-2.0.2
1、安装依赖包
yum -y install openssl openssl-devel
2、编译安装
tar zxvf keepalived-2.0.2.tar.gz
cd keepalived-2.0.2
./configure --prefix=/usr/local/keepalived
make && make install
注意:*如果keepalived的配置文件不在/etc/keepalived/下记得要复制一份过来,不然启动的时候会报错
三、配置mysql主主复制
1、mysql1里面配置
server-id=1
#server唯一标识符
auto_increment_offset=1
#自增ID起始值
auto_increment_increment=2
#每次自增数字
log-bin=mysql-bin
#开启二进制功能,主服务器必须打开
max_binlog_size=1024M
#binlog单文件最大值
replicate-ignore-db=mysql
replicate-ignore-db=informaton_schema
replicate-ignore-db=performance_schema
replicate-ignore-db=test
#忽略不同步主从数据库
2、mysql2里面配置
server-id=2
#server唯一标识符
auto_increment_offset=2
#自增ID起始值
auto_increment_increment=2
#每次自增数字
log-bin=mysql-bin
#开启二进制功能,主服务器必须打开
max_binlog_size=1024M
#binlog单文件最大值
replicate-ignore-db=mysql
replicate-ignore-db=informaton_schema
replicate-ignore-db=performance_schema
replicate-ignore-db=test
#忽略不同步主从数据库
3、mysql重启
service mysql restart
4、配置同步数据
登录mysql并在master1上和master2上输入此语句,记得具体情况根据自己的配置看
change master to master_host='111.1.19.122',master_user='repl',master_password='unioncast.cn',master_log_file='mysql-bin.000005',master_log_pos=154;
登录时报错:mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
此意思是说在命令行直接进行密码登录不安全。这是mysql新版的一个安全改进,官方给出的解释是在命令行下如果要使用密码可以在执行命令后的提示输入里输入密码,或者在指定的安全文件内指定密码;如果还不行就该密码
解决方法:输入-p回车后在输入密码就可以啦
改密码:
在配置文件my.cnf中加入
skip-grant-tables
#跳过密码登录
然后重启数据库后登录mysql
update mysql.user set authentication_string=password('unioncast.cn') where user='root';
flush privileges;
exit
去掉重启
skip-grant-tables
#跳过密码登录
三、配置keepalived
Configuration File for keepalived
global_defs {
notification_email {
fangjuanqin@unioncast.cn
}
notification_email_from keepalived@mysql.com
smtp_server 127.0.0.1
smtp_connect_timeout 30
router_id mysql_ha
}
vrrp_instance VI_1 {
state BACKUP
interface em1
#指定HA检测网络的接口
virtual_router_id 52
#路由标识符,两节点必须一致
priority 100
advert_int 1
#组播信息发送间隔时间。两个节点必须一样
nopreempt
#不抢占资源,只在master上设置
authentication {
#验证信息。两节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
#设置VIP
172.16.1.111
}
}
virtual_server 172.16.1.111 3306 {
delay_loop 3
#设置健康检查时间
lb_algo rr
#设置负载调度算法
lb_kind DR
persistence_timeout 80
#客户连接保留时间
protocol TCP
1
#指定转发协议
real_server 172.16.1.20 3306 {
weight 1
notify_down /usr/local/keepalived/mysql.sh
TCP_CHECK {
connect_timeout 8
#连接超时时间
nb_get_retry 3
#重试次数
delay_before_retry 3
#两次重试间隔时间
connect_port 3306
#测试连接的端口
#检测MySQL端口
}
}
}
注意:如果是阿里云的服务器记得将keepalived的组播改成单播不然会出现闹列现象
nginx健康监测脚本
#!/bin/bash
counter=$(netstat -na |grep "LISTEN" |grep "3306" |wc -l)
if [ "${counter}" -eq 0 ];then
/etc/init.d/keepalived stop
fi