赞
踩
VMware16 pro:https://www.aliyundrive.com/s/wF66w8kW9ac
centos镜像:https://www.aliyundrive.com/s/UQMBPEovxNg
ps:镜像下载之后修改后缀为iso
这里直接搜索上海
用以上安装之后我发现内部是连接不上外网以及我宿主机无法访问这台虚拟机
vi /etc/sysconfig/network-scripts/ifcfg-ens33
BOOTPROT0:设置为静态ip
IPADDR:就是这台虚拟机的ip
NETMASK:子网掩码,跟我们宿主机配置的一样就行
GATERWAY:网关,同样配置成我们外部的
service network restart
发现能访问外网了,宿主机也能访问虚拟机内部
按照以上的模式又创建了一个虚拟机,也能ping通
sudo yum install -y yum-utils \ device-mapper-persistent-data \ lvm2
sudo yum-config-manager \ --add-repo \ https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io
启动 docker
sudo systemctl start docker
sudo systemctl enable docker
5.配置 docker 镜像加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://fka6fyyd.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
docker pull mysql:5.7
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/log:/var/log/mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
参数说明
-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口
-v /mydata/mysql/conf:/etc/mysql:将配置文件夹挂载到主机
-v /mydata/mysql/log:/var/log/mysql:将日志文件夹挂载到主机
-v /mydata/mysql/data:/var/lib/mysql/:将配置文件夹挂载到主机
-e MYSQL_ROOT_PASSWORD=root:初始化 root 用户的密码
vi /mydata/mysql/conf/my.cnf
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
skip-name-resolve
docker exec -it mysql mysql -uroot -proot
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;
flush privileges;
docker update mysql --restart=always
MySQL双主双活是指两台mysql服务器mysql-1、mysql-2都为master主节点服务器,同时又是对方的slave从节点,每个数据库都可作为主数据库使用,并将对数据库操作的数据同步至另外一台mysql服务中。 当应用服务开发过程中使用了mysql-1连接信息,在打包发布后,数据库连接信息已经固定,当数据库mysql-1出现异常时,需要人工干预先将应用服务停止–>将应用服务的mysql连接信息改为mysql-2 -->在启动应用服务器,比较繁琐,当应用服务器较多时,一个一个关闭,修改,再重启,将耽误更多时间,应用服务器修复故障时间延长,严重时会造成灾难性的后果。
故而引入了keepalived,keepalived通过VIP虚拟IP的漂移实现高可用,在相同集群内发送组播包,master主通过VRRP协议发送组播包,告诉从主的状态。
当我们通过keepalived虚拟出一个ip服务 mysql-3,应用服务只需要将mysql配置信息更改为mysql-3的配置信息,mysql-3实际代理的实体服务器为mysql-1或mysql-2。
例如:当mysql-3实际代理mysql-1时,mysql-1服务出现故障后,keepalived通过自身机制,自动将mysql-2作为实际代理主服务器,不需要人工干预去修改mysql配置信息,从而实现了高可用。
MySQL复制过程分为三步:
主:192.168.9.13
从:192.168.9.14
CREATE USER 'cpuser'@'192.168.9.14' IDENTIFIED WITH mysql_native_password BY 'root';
GRANT REPLICATION SLAVE ON *.* TO 'cpuser'@'192.168.9.14';
注:这里的cpuser 和root是一会儿备份服务器配置是需要用到的master服务器的用户名和密码,需要记下来)
vi /mydata/mysql/conf/my.cnf
注意这里不是/etc/my.cnf,因为我上面用docker安装的,是把配置文件挂载到/mydata/mysql/conf/my.cnf
# 启用二进制日志记录 (binlog),用于记录所有对数据库的修改操作,以便进行数据恢复和复制等操作。 log-bin=mysql-bin # 指定 binlog 是否需要同步写入磁盘,可以保证数据的完整性和持久性。默认值为 0,即不强制同步写入磁盘 sync_binlog = 1 # 指定 binlog 的格式,mixed 表示使用基于语句和基于行的混合模式,可以在不同场景下选择最佳的模式。 binlog_format=mixed #服务器唯一性标识符,每台服务器配置必须保存不一样 server-id=1 # 指定 binlog 的校验方式,none 表示不进行校验。NONE, CRC32, 或 SHA256。默认值为 NONE binlog_checksum=none # 是否为只读模式,可选值为 0 或 1。默认值为 0,即不是只读模式。如果设置为 1, # 则表示 MySQL 服务器将只允许读操作,不允许写操作。这个参数适用于需要限制写入操作的情况,比如备份服务器或只需要查询的从库。 read-only=0 #需要备份的那个数据库名叫“test_db”(可选)如果不指定数据库,默认同步所有的数据库,若有多个,则配置多个binlog-do-db binlog-do-db=test_db1 binlog-do-db=test_db2 #这里设置用来台服务器来做备份,按个人情况定 我们这里是主主复制,所以是两台,。 auto-increment-increment=2 #表示这台服务器序号,从1开始,不超auto-increment-increment #配置完该数据库中插入第一个数据id=1,第二条数据id=3而不是2,避免的数据库集群中id冲突 auto-increment-offset=1 # 用于指定当从库出现错误时,是否跳过该错误并继续进行复制操作。 # 可选值为 ALL 或一个正整数。默认值为 0,即不跳过任何错误。如果设置为 ALL,则表示跳过所有错误,不建议在生产环境中使用。 slave-skip-errors = all
Position:记住这里的值,在后面配置需要用到
vi /mydata/mysql/conf/my.cnf
# 启用二进制日志记录 (binlog),用于记录所有对数据库的修改操作,以便进行数据恢复和复制等操作。 log-bin=mysql-bin # 指定 binlog 是否需要同步写入磁盘,可以保证数据的完整性和持久性。默认值为 0,即不强制同步写入磁盘 sync_binlog = 1 # 指定 binlog 的格式,mixed 表示使用基于语句和基于行的混合模式,可以在不同场景下选择最佳的模式。 binlog_format=mixed #服务器唯一性标识符,每台服务器配置必须保存不一样 server-id=2 # 复制过程中的一个过滤器,用于指定在主库上进行哪些数据库的更改需要被复制到从库。 # 即replicate-do-db=test_db1 表示仅复制名为 test_db1 的数据库的更改到从库。 # 如果不指定数据库,默认同步所有的数据库,若有多个,则配置多个replicate-do-db replicate-do-db=test_db1 replicate-do-db=test_db2 # MySQL 从服务器中继日志的名称和位置。relay-log=mysql.relay.bin 表示中继日志的文件名为 mysql.relay.bin relay-log=mysql.relay.bin # 参数指定从服务器是否将更新记录到自己的二进制日志中。当该参数设置为 ON 时,从服务器会将更新记录到自己的二进制日志中, # 以便在后续的复制过程中,能够将这些更新发送给其它从服务器。 # 默认情况下,该参数的值为 OFF,表示从服务器不会记录更新到自己的二进制日志中。 # 需要注意的是,log-slave-updates 参数只在 MySQL 主从复制模式的情况下有意义, # 它用来控制从服务器是否将更新记录到自己的二进制日志中。如果没有使用主从复制,则该参数不起作用。 log-slave-updates=ON
change master to master_host='192.168.9.13',master_port=3306,master_user='cpuser',master_password='root',master_log_file='mysql-bin.000001',master_log_pos=150;
ps:上面命令中192.168.1.13为主机ip; 3306主机端口;
cpuser/root 同步使用的用户/密码 mysql-bin.000001同步使用的文件;148同步使用的标识码
start slave;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
当此两项都为yes 且没有错误信息
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
这个时候就是已经配置了13-14的同步,只需要在13上操作然后看14上是否会产生相同的就行
CREATE USER 'cpuser'@'192.168.9.13' IDENTIFIED WITH mysql_native_password BY 'root';
GRANT REPLICATION SLAVE ON *.* TO 'cpuser'@'192.168.9.13';
vi /mydata/mysql/conf/my.cnf
# 主机使用配置 如果不指定数据库,默认同步所有的数据库
read-only=0
binlog-do-db=test_db1
auto-increment-increment=2
auto-increment-offset=2
show master status
#从机使用配置 如果不指定数据库,默认同步所有的数据库
replicate-do-db=test_db1 #主库复制到当前从库的数据库
replicate-do-db=test_db2
relay-log=mysql.relay.bin #中继日志
log-slave-updates=ON
change master to master_host='192.168.9.14',master_port=3306,master_user='cpuser',master_password='root',master_log_file='mysql-bin.000006',master_log_pos=592;
注:host为22服务的IP地址,user、password是在22服务上创建的备份用户,log_file、log_pos是在22服务上看到的master状态信息
start slave;
show slave status
跟上面显示一个就表示成功
Keepalived的工作原理是VRRP(协议) VRRP里面有两个概念
1.VRRP路由器和虚拟路由器,主控路由器和备份路由器
2.VRRP路由器是指运行VRRP的路由器,是物理实体,虚拟路由器是指VRRP协议创建的,是逻辑概念。一组VRRP路由器协同工作,共同构成一台虚拟路由器。
Vrrp中存在着一种选举机制,主控路由,其他的则成了备份路由。当主控路由失效后,备份路由中会重新选举出一个主控路由,来继续工作,来保障不间断服务
通过VIP实现Mysql双主对外连接的统一接口。即客户端通过Vip连接数据库;
当其中一台宕机后,VIP会漂移到另一台上,这个过程对于客户端的数据连接来说几乎无感觉,从而实现高可用(有点类似于ng的概念),用这种方式保持高可用
[root@localhost ~]# yum install -y openssl-devel
[root@localhost ~]# cd /usr/local/
[root@localhost local]# wget --no-check-certificate http://www.keepalived.org/software/keepalived-1.3.5.tar.gz
[root@localhost local]# tar -zxvf keepalived-1.3.5.tar.gz
[root@localhost local]# cd keepalived-1.3.5
[root@localhost keepalived-1.3.5]# ./configure
//此处会有警告提示,忽略即可!
[root@localhost keepalived-1.3.5]# make && make install
# 或使用 yum安装
[root@localhost ~] yum -y install keepalived
[root@localhost ~] cd /etc/keepalived
[root@localhost ~] vim keepalived.conf
! Configuration File for keepalived global_defs { notification_email { 761200809@qq.com } notification_email_from 761200809@qq.com smtp_server 127.0.0.1 smtp_connect_timeout 30 } cript chk_mysql_port { script "/opt/chk_mysql.sh" #这里通过脚本监测mysql interval 2 #脚本执行间隔,每2s检测一次 weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5 fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间) rise 1 #检测1次成功就算成功。但不修改优先级 } vrrp_instance VI_1 { state MASTER interface ens33 #指定虚拟ip的网卡接口 通过ifconfig查看以确定 mcast_src_ip 192.168.9.13 #本机ip virtual_router_id 51 #路由器标识,MASTER和BACKUP必须一致 priority 100 #定义优先级,数字越大,优先级越高 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.9.88 #VIP } track_script { chk_mysql_port } }
vim /opt/chk_mysql.sh
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "3306"|wc -l)
if [ "${counter}" -eq 0 ]; then
systemctl stop keepalived
fi
13的MySQL服务挂了,14会监听到,然后请求192.168.9.88成为主
systemctl enable keepalived 开机启动
systemctl start keepalived 启动
systemctl status keepalived 查看状态
Configuration File for keepalived global_defs { notification_email { 761200809@qq.com } notification_email_from 761200809@qq.com smtp_server 127.0.0.1 smtp_connect_timeout 30 } vrrp_script chk_mysql_port { script "/opt/chk_mysql.sh" #这里通过脚本监测 interval 2 #脚本执行间隔,每2s检测一次 weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5 fall 2 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间) rise 1 #检测1次成功就算成功。但不修改优先级 } vrrp_instance VI_1 { state MASTER interface ens33 #指定虚拟ip的网卡接口 mcast_src_ip 192.168.9.14 #本机ip virtual_router_id 51 #路由器标识,MASTER和BACKUP必须一致 priority 99 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。 advert_int 1 authentication { auth_type PASS auth_pass 1111 } virtual_ipaddress { 192.168.9.88 #VIP } track_script { chk_mysql_port } }
ps:一样的操作步骤,不过是配置文件稍微修改,要priority 设置比13的小
用以前的方式连接或者使用配置文件的vip连接都可以
因为在13配置的权重大于14上的,所以这个时候88连接的实际上是13
但是这个时候我发现用vip去连接也连接不上,也就是没有漂移
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。