资源清单:
服务器:两台
配置:系统:Centos 6.9 ,磁盘:50G+500,CPU: 8C,内存:16G
架构思路:
1.两台mysql都可读写,互为主备,默认只使用一台(masterA)负责数据的写入,另一台(masterB)备用;
2.masterA是masterB的主库,masterB又是masterA的主库,它们互为主从;
3.两台主库之间做高可用,可以采用keepalived等方案(使用VIP对外提供服务);
4.所有提供服务的从服务器与masterB进行主从同步(双主多从);
5.采用高可用策略的时候,masterA或masterB均不因宕机恢复后而抢占VIP(非抢占模式);
这样做可以在一定程度上保证主库的高可用,在一台主库down掉之后,可以在极短的时间内切换到另一台主库上(尽可能减少主库宕机对业务造成的影响),减少了主从同步给线上主库带来的压力;
但是也有几个不足的地方:
1.masterB可能会一直处于空闲状态(可以用它当从库,负责部分查询);
2.主库后面提供服务的从库要等masterB先同步完了数据后才能去masterB上去同步数据,这样可能会造成一定程度的同步延时;
架构的简易图如下:

安装步骤:
一、磁盘挂载:
1. 查看可用磁盘 fdisk -l
2. 新增磁盘 fdisk /dev/可用磁盘
输入n:添加新分区,
输入p:主分区,
输入1:表示1个分区,
输入回车:从磁盘开始,
输入回车:到磁盘结尾
输入t:改变分区类型
输入8e:改变分区LVM
输入w:保存退出
说明:p表示打印当前状态
3.磁盘挂载
mkfs.ext3 /dev/磁盘1 mkfs.ext4 /dev/磁盘1 mkfs.xfs /dev/磁盘1
等待设置完成后就可以挂载到相应的文件夹下进行使用了
我在当前系统根目录下创建了一个挂载目录 目录并用来做一个挂载点:
mount /dev/磁盘1 /挂载目录
自动挂载
vgdisplay 或 blkid /设备 查看UUID
写入 /etc/fstab
mount -a 查看是否自动挂载
二、下载mysql服务:
1.从网上下载安装包,然后上传。
2.解压tar包 .
cd /usr/local/
tar -zxvf mysql**** 解压
mv mysql**** mysql 重命名
groupadd mysql 创建用户组
useradd -r -g mysql mysql 创建用户添加进用户组 -r标识系统内部用户
chown -R mysql mysql 给用户加mysql文件权限
chgrp -R mysql mysql 给用户组mysql文件权限
ln -s /usr/local/mysql/bin/mysql /usr/bin
三、.修改my.ini 或者 my.cnf (配置文件部分内容可根据实际调整,红色部分是比较重要的)
[client]
port=1234 #客户端端口
socket=/tmp/mysql.sock
[mysqld]
port=1234 #服务端口
#datadir=/var/lib/mysql
datadir=/usr/local/mysql/data #数据目录
#socket=/var/lib/mysql/mysql.sock
socket=/tmp/mysql.sock #
character_set_server=utf8 #设置编码
init_connect='SET NAMES utf8'
basedir=/usr/local/mysql #mysql目录
user=mysql #用户
skip-external-locking
key_buffer_size=256
max_allowed_packet=16M
#slave-skip-error=1060,1062,1032,1050,1061 #跳过错误同步代码
myisam_sort_buffer_size=64M
slave_type_conversions=ALL_NON_LOSSY,ALL_LOSSY
#skip-grant-tables #跳过root登录修改密码用的
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
#bind-address =192.168.11.72 监听IPV6
bind-address=0.0.0.0 #监听IPV4
relay-log=/usr/local/mysql/log/slave-relay-log
relay-log-index=/usr/local/mysql/log/slave-relay-log.index
server-id=72 #唯一id
auto-increment-offset = 2 #主备区分, 主=1 ,备=2
auto-increment-increment = 2 #主备都一样
log-bin=mysql-bin #log-bin名称 随意
binlog-format=MIXED
expire_logs_days=10 # 日志保存天数
log_slave_updates=true
#replicate-ignore-table
default-storage-engine=INNODB
long_query_time=2
replicate-ignore-db=mysql,information_schema
innodb_file_per_table
max_connections=100 #最大连接数100
table_open_cache=2048
binlog_cache_size=1M
max_heap_table_size=64M
read_buffer_size=2M #缓存大小
read_rnd_buffer_size=16M
sort_buffer_size=8M
join_buffer_size=8M
thread_cache_size=8 #线程数量
#thread_concurrency=8
query_cache_size=64M
query_cache_limit=2M
ft_min_word_len=4
transaction_isolation=REPEATABLE-READ
tmp_table_size=64M
slow_query_log
#innodb_additional_mem_pool_size=16M
innodb_buffer_pool_size=512m
innodb_write_io_threads=8
innodb_read_io_threads=8
innodb_thread_concurrency=16
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=8M
innodb_log_file_size=8M
innodb_log_files_in_group=8M
innodb_max_dirty_pages_pct=90
innodb_lock_wait_timeout=120
[mysqldump]
quick
max_allowed_packet=16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size=64M
sort_buffer_size=64M
read_buffer=2M
write_buffer=2M
[mysqld_safe]
log-error=/usr/local/mysql/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
lower_case_table_names=1
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
max_connections=100 default-time_zone = '+8:00'
四、初始化
vi /var/log/mysqld.log 保存
chmod 777 /var/log/mysqld.log #赋权
chown mysql:mysql /var/log/mysqld.log #赋权
/usr/local/mysql/bin/mysqld --initialize --user=mysql --lc_messages_dir=/usr/local/mysql/share --lc_messages=en_US #初始化
1.查看初始密码
cat /var/log/mysqld.log
2..启动mysql服务
将mysql.server 启动脚本复制到服务中
#cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
将脚本授权
#chmod 700 /etc/init.d/mysqld
启动mysql服务
service mysqld start
注意点: xxx.pid缺失问题
cd /var/run/
mkdir mysqld
chmod 777 mysqld/
cd mysqld/
vi xxx.pid //创建xxx.pid文件保存
chmod 777 xxx.pid
chown mysql:mysql xxx.pid
service mysqld start //启动成功
登录修改root密码
/usr/local/mysql/bin/mysql -u root -p
set password for [email protected] = password('密码'); #如果修改密码报错,先执行 flush privileges;
flush privileges;
use mysql ;
update user set host = '%' where user ='root';
flush privileges;
创建对应的数据库 或者对应的用户
create database 数据库;
use 数据库;
create user '用户'@'%' identified by '密码';
update mysql.user set authentication_string=password('[email protected]') where user='aoma';
赋权限
GRANT ALL PRIVILEGES ON *.* TO '用户'@'%' IDENTIFIED BY '密码' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO '用户'@'%' WITH GRANT OPTION;
主从数据库都运行后
show slave status\G;
stop slave ;
show master status\G; # 可以为root 用户
change master to master_host='192.168.70.71', master_port=1234,master_user='用户', master_password='密码',master_log_file='master-bin.xxx',master_log_pos=xxx; #主备都要执行
#change master to master_host='192.168.70.72', master_port=1234,master_user='用户', master_password='密码',master_log_file='master-bin.xxx',master_log_pos=xxx;
start slave ;
观察同步情况 show slave status\G;
五、.keepalived
1.yum install -y keepalived /如果没联网 自行下载再上传
2.修改keepalived配置文件
vi /etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id MASTER-HA
}
vrrp_script chk_mysql_port { #检测mysql服务是否在运行。有很多方式,比如进程,用脚本检测等等
script "/etc/keepalived/chk_mysql.sh" #这里通过脚本监测
interval 3 #脚本执行间隔,每2s检测一次
weight -5 #脚本结果导致的优先级变更,检测失败(脚本返回非0)则优先级 -5
fall 5 #检测连续2次失败才算确定是真失败。会用weight减少优先级(1-255之间)
rise 1 #检测1次成功就算成功。但不修改优先级
}
vrrp_instance VI_1 {
state BACKUP #主备都为BACKUP 防止脑裂
interface eth1 #指定虚拟ip的网卡接口
#nopreempt #主要添加,防止主恢复后自动切回抢夺VIP资源 ,添加后priority 意义不大,只用于最初的主备判断。
mcast_src_ip 192.168.70.72 #另一个节点为 192.168.70.71
virtual_router_id 79 #路由器标识,MASTER和BACKUP必须是一致的
priority 101 #定义优先级,数字越大,优先级越高,在同一个vrrp_instance下,MASTER的优先级必须大于BACKUP的优先级。这样MASTER故障恢复后,就可以将VIP资源再次抢回来
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.70.70 #虚拟ip vip
}
track_script {
chk_mysql_port
}
}
3.编写检查脚本 可根据情况自行修改
vi chk_mysql.sh
#!/bin/bash
counter=$(netstat -na|grep "LISTEN"|grep "1234"|wc -l)
if [ "${counter}" -eq 0 ]; then
/etc/init.d/keepalived stop
fi
最后
云平台要申请虚拟ip ,然后进行网卡的绑定。
两台服务器都绑定申请的虚拟ip即可 。