MySQL主备集群搭建

1. 搭建前环境检查

(1) 检查防火墙是否关闭:

systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld

(2) 查看swap空间是否关闭:

free -h
关闭 : swapoff -a

(3) selinux查看:

    sestatus
    或者 :   cat /etc/selinux/config

##sestatus:#查看selinux完整状态
##setenforce 0|1#开启或关闭
##0:设置为permissive
##1:设置为enforcing
##配置文件:
##/boot/grub/grub.conf在对应的kernel内核参数后面追加
##selinux=1 (启用)selinux=0(禁用)
##/etc/sysconfig/selinux
##/etc/selinux/config
##SELINUX变量有3中参数:
##SELINUX={disabled|enforcing|permissive}
##ps:https://www.cnblogs.com/sunshine-long/p/8871947.html
##SELinux工作模式可以在/etc/selinux/config中设定。
##如果想从disabled切换到enforcing或者permissive的话,需要重启系统。反过来也一样。
##enforcing和permissive模式可以通过setenforce1|0命令快速切换。
##需要注意的是,如果系统已经在关闭SELinux的状态下运行了一段时间,在打开SELinux之后的第一次重启速度可能会比较慢。因为系统必须为磁盘中的文件创建安全上下文(我表示我重启了大约10分钟,还以为是死机了……)。
##SELinux日志的记录需要借助auditd.service这个服务,请不要禁用它。

(4) 查看磁盘是否挂载

lsblk

例如 经测试根目录为ssd盘(4240G raid0+1)在 10.162.16.221~ 10.162.16.223上挂载磁盘sdb(600G2 raid1,作为bin_log日志存储)

1.建立挂载点
mkdir -p /data
2.挂载数据盘
echo -e 'mklabel gpt \nmkpart primary 0% 100%\nyes\nquit\n' |parted /dev/sdb
mkfs.xfs -f /dev/sdb1 
a=`blkid /dev/sdb1|awk -F '"' '{print $2}'` 
echo "UUID=$a /data   xfs defaults,noatime 1 2" >> /etc/fstab
mount -a

###将分区设置成gpt格式
## parted  /dev/sdc mklabel gpt
###创建一个20G的分区
##parted /dev/sdc mkpart primary 0 20000
###将剩余的空间全部创建成一个扩展分区 
## parted /dev/sdc mkpart extended 1 100%
##/dev/sdd分区分成1个分区
##parted /dev/sdd mklabel gpt
##parted /dev/sdd mkpart primary 0 100%
##将硬盘分为两个主分区
##[root@localhost ~]# parted /dev/sdb   
##GNU Parted 1.8.1 Using /dev/sdb Welcome to GNU Parted! Type ‘help’ to view a list of commands.
##(parted) mklabel gpt           # 将MBR磁盘格式化为GPT
##(parted) print                       #打印当前分区
##(parted) mkpart primary 0 4.5TB                # 分一个4.5T的主分区
##(parted) mkpart primary 4.5TB 12TB      # 分一个7.5T的主分区
##(parted) print                         #打印当前分区
##(parted) quit 退出

(5) 查看主机上是否有mysql存在:

    rpm -qa |grep -i mysql
    使用命令卸载 : rpm -e --nodeps xxxxxx

#一、如果是使用yum安装的mysql,使用如下命令进行卸载(不能确定使用何种方式安装的mysql情况下,按后续步骤一一进行处理即可):
## yum remove mysql mysql-server mysql-libs compat-mysql51
## rm -rf /var/lib/mysq
## rm /etc/my.cnf
#使用rpm -qa|grep mysql命令来查看rpm方式安装的mysql,如果查询结果不为空,需要将这些rpm卸载掉。
#
#二、如果是使用rpm方式安装的mysql,按如下步骤进行处理:
#查看系统中是否以rpm包安装的mysql:
## rpm -qa | grep -i mysql
#使用rpm -e 命令将上个命令中包列表一一进行卸载。
#
#然后删除mysql相关的服务。
## chkconfig --list | grep -i mysql
## chkconfig --del mysql
#
#然后找出OS中分散的mysql文件夹,并删除。
## find / -name mysql
#
#最后清空mysql相关的的所有目录以及文件
## rm -rf 

(6) 建立hadoop用户

hadoop用户
useradd -d /home/hadoop hadoop
echo 'H_x86_r00t' | passwd --stdin hadoop
echo "hadoop soft nofile 131072" >> /etc/security/limits.conf
echo "hadoop hard nofile 131072" >> /etc/security/limits.conf
echo "hadoop soft nproc unlimited" >> /etc/security/limits.d/20-nproc.conf
echo "hadoop hard nproc unlimited" >> /etc/security/limits.d/20-nproc.conf
chage -M 99999 hadoop

(7) 配置hadoop用户免密:

步骤1: 用 ssh-key-gen 在主机10.162.16.221上创建公钥和密钥
ssh-keygen -t rsa                             
步骤2: 用 ssh-copy-id 把公钥复制到远程主机上
 ssh-copy-id -i ~/.ssh/id_rsa.pub  10.162.16.222
步骤3:ssh到主机10.162.16.222
scp -r ~/.ssh/ 到10.162.16.221和10.162.16.223

2. 搭建mysql-5.7.20-1.el7.x86_64

(1) 上传解压mysql-5.7.20-1.el7.x86_64.rpm-bundle.tar

tar  -zxvf  mysql-5.7.20-1.el7.x86_64.rpm-bundle.tar  -C   mysql/

(2) 按照顺序安装:

按照以下顺序进行安装,因为它们之间存在依赖关系
common --> libs --> clients --> server
此外需要安装libs-compat ,devel

rpm  -ivh  mysql-community-common-5.7.20-1.el7.x86_64.rpm
rpm  -ivh  mysql-community-libs-5.7.20-1.el7.x86_64.rpm
rpm  -ivh  mysql-community-client-5.7.20-1.el7.x86_64.rpm
rpm  -ivh  mysql-community-server-5.7.20-1.el7.x86_64.rpm
rpm  -ivh  mysql-community-libs-compat-5.7.20-1.el7.x86_64.rpm
rpm  -ivh  mysql-community-devel-5.7.20-1.el7.x86_64.rpm

当安装server中出现:



需要补充依赖:

yum -y install libaio  
yum -y install net-tools  
yum -y install perl

#perl依赖:
#perl-Carp.noarch 0:1.26-244.el7
#perl-Encode.x86_64 0:2.51-7.el7
#perl-Exporter.noarch 0:5.68-3.el7
#perl-File-Path.noarch 0:2.09-2.el7
#perl-File-Temp.noarch 0:0.23.01-3.el7
#perl-Filter.x86_64 0:1.49-3.el7
#perl-Getopt-Long.noarch 0:2.40-3.el7
#perl-HTTP-Tiny.noarch 0:0.033-3.el7
#perl-PathTools.x86_64 0:3.40-5.el7
#perl-Pod-Escapes.noarch 1:1.04-297.el7
#perl-Pod-Perldoc.noarch 0:3.20-4.el7
#perl-Pod-Simple.noarch 1:3.28-4.el7
#perl-Pod-Usage.noarch 0:1.63-3.el7
#perl-Scalar-List-Utils.x86_64 0:1.27-248.el7
#perl-Socket.x86_64 0:2.010-5.el7
#perl-Storable.x86_64 0:2.45-3.el7
#perl-Text-ParseWords.noarch 0:3.29-4.el7
#perl-Time-HiRes.x86_64 4:1.9725-3.el7
#perl-Time-Local.noarch 0:1.2300-2.el7
#perl-constant.noarch 0:1.27-2.el7
#perl-libs.x86_64 4:5.16.3-297.el7
#perl-macros.x86_64 4:5.16.3-297.el7
#perl-parent.noarch 1:0.225-244.el7
#perl-podlators.noarch 0:2.5.1-3.el7
#perl-threads.x86_64 0:1.87-4.el7
#perl-threads-shared.x86_64 0:1.43-6.el7

(3) my.cnf文件的配置:

-master节点(10.162.16.221):

[client]
port = 3306
socket = /var/lib/mysql/mysql.sock

[mysqld]
datadir=/var/lib/mysql/
socket=/var/lib/mysql/mysql.sock
server-id = 221
symbolic-links=0

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

skip-external-locking
key_buffer_size = 16K
max_allowed_packet = 1M
table_open_cache = 4
sort_buffer_size = 512K
read_buffer_size = 512K
read_rnd_buffer_size = 512K
net_buffer_length = 2K
thread_stack = 512K
user=mysql
log_bin=/data/mysql-bin/mysql-bin
log-slave-updates
binlog_format=mixed
max_binlog_size=1G
binlog_row_image=full
group_concat_max_len=10240000
relay_log=mysqld-relay-bin                       
log-slave-updates=YES
log_bin_trust_function_creators=1
lower_case_table_names=1
sql_mode=
transaction_isolation=READ-COMMITTED
binlog_format=mixed
max_allowed_packet=104857600
character_set_server=utf8
collation_server=utf8_general_ci

open_files_limit = 65535
max_connections = 3000
event_scheduler = on
wait_timeout=86400
interactive_timeout = 86400
slave_parallel_type=LOGICAL_CLOCK
slave-parallel-workers=8
relay_log_recovery = 1
master_info_repository = TABLE
relay_log_info_repository = TABLE
default-time_zone = '+8:00'

skip_name_resolve = 1
max_connect_errors=1000
federated
lock_wait_timeout = 900
long_query_time = 2
slow_query_log = 1
slow_query_log_file = slow.log
log_timestamps = SYSTEM
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
innodb_file_per_table = 1
innodb_buffer_pool_size = 12G
innodb_doublewrite = ON
innodb_thread_concurrency = 64
innodb_purge_threads = 6
innodb_read_io_threads = 6
innodb_write_io_threads = 6
innodb_buffer_pool_instances = 10
innodb_log_file_size = 512M
innodb_log_files_in_group = 3
innodb_log_buffer_size = 100M
innodb_io_capacity = 400
innodb_io_capacity_max = 800
innodb_flush_method = O_DIRECT
innodb_flush_neighbors = 0
innodb_print_all_deadlocks = 1

join_buffer_size=4M
tmp_table_size=64M
read_buffer_size=4M
read_rnd_buffer_size=4M
innodb_sort_buffer_size=4M

###semi sync replication settings###
plugin_dir = /usr/lib64/mysql/plugin
plugin_load='rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so'
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000

-slave节点(10.162.16.222,10.162.16.223):

[client]
port = 3306
socket = /var/lib/mysql/mysql.sock
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server-id = 222#多个节点不能重复
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
skip-external-locking
key_buffer_size = 16K
max_allowed_packet = 1M
table_open_cache = 4
sort_buffer_size = 512K
read_buffer_size = 512K
read_rnd_buffer_size = 512K
net_buffer_length = 2K
thread_stack = 512K
user=mysql
log_bin=/data/mysql-bin/mysql-bin
log-slave-updates
binlog_format=mixed
max_binlog_size=1G
binlog_row_image=full
group_concat_max_len=10240000
relay_log=mysqld-relay-bin                      
log-slave-updates=YES
log_bin_trust_function_creators=1
lower_case_table_names=1
sql_mode=
transaction_isolation=READ-COMMITTED
binlog_format=mixed
max_allowed_packet=104857600
character_set_server=utf8
collation_server=utf8_general_ci
#replicate_wild_do_table##执行备份的表
replicate_wild_ignore_table#备份过程中忽略的表
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=performance_schema.%
#replicate-do-db=databasename1,databasename2#执行备份的db
#replicate-ignore-db =databasename1,databasename2#忽略备份的db
#read_only=on
#read-only=1
open_files_limit = 65535
max_connections = 3000
event_scheduler = on
wait_timeout=86400
interactive_timeout = 86400
slave_parallel_type=LOGICAL_CLOCK
slave-parallel-workers=8
relay_log_recovery = 1
master_info_repository = TABLE
relay_log_info_repository = TABLE
default-time_zone = '+8:00'
skip_name_resolve = 1
max_connect_errors=1000
federated
lock_wait_timeout = 900
long_query_time = 2
slow_query_log = 1
slow_query_log_file = slow.log
log_timestamps = SYSTEM
innodb_flush_log_at_trx_commit = 1
sync_binlog = 1
innodb_file_per_table = 1
innodb_buffer_pool_size = 12G
innodb_doublewrite = ON
innodb_thread_concurrency = 64
innodb_purge_threads = 6
innodb_read_io_threads = 6
innodb_write_io_threads = 6
innodb_buffer_pool_instances = 10
innodb_log_file_size = 512M
innodb_log_files_in_group = 3
innodb_log_buffer_size = 100M
innodb_io_capacity = 400
innodb_io_capacity_max = 800
innodb_flush_method = O_DIRECT
innodb_flush_neighbors = 0
innodb_print_all_deadlocks = 1
join_buffer_size=4M
tmp_table_size=64M
read_buffer_size=4M
read_rnd_buffer_size=4M
innodb_sort_buffer_size=4M
###semi sync replication settings###
plugin_dir = /usr/lib64/mysql/plugin
plugin_load='rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so'
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000

(4) 启动mysql服务:

service mysqld start
#若出现报错:
#Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist
#2021-01-06T13:12:13.038795+08:00 0 [ERROR] Fatal error: Failed to initialize ACL/grant/time zones structures or failed to remove temporary table files.
#需清空数据存储目录datadir
chmod 777 /var/lib/mysql/mysql.sock

进入mysql数据库:

mysql  -uroot -p 
#mysql安装时会产生一个临时的密码 我们获取这个密码
#grep 'temporary password' /var/log/mysqld.log

(5)修改root密码,创建主从库复制用户master:

#在my.cnf中添加
#skip-grant-tables=1
#重启mysql
#登录进入数据库执行
#flush privileges;
#set password for root@localhost = password('1');
# flush privileges;
#***改完密码要把配置改回来,再重启
set global validate_password_policy=0;
set global validate_password_length=4;
##可能执行不成功,对密码格式的要求,可忽略
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('A_yLwVTr2J_O');
grant replication slave on *.* to 'master'@'%'identified by 'oracle';
flush privileges;

(6) 测试:

在Master的数据库中建立一个备份帐户:每个slave使用标准的MySQL用户名和密码连接master。进行复制操作的用户会授予REPLICATION SLAVE权限。用户名的密码都会存储在文本文件master.info中。

主库
授权用户:

mysql>  grant replication slave on *.* to 'master'@'%'identified by 'oracle';
mysql> flush privileges;

建立一个复制账户master,设置密码为oracle,并授权replication slave

从库:

mysql> grant replication slave on *.*  to 'master'@'%' identified by 'oracle';
mysql> flush privileges;

测试授权账户是否OK,让10.162.16.221和10.162.16.222互访登录就OK
主库主机访问从库:

mysql -h 10.162.16.222 -u master -p
oracle

从从库访问主库:

mysql -h 10.162.16.221 -u master -p 
oracle

3. 主从同步设置:

  • 到主库中执行(使用root登录执行) :
show  master  status \G
  • 到从库中执行:
change master to     
master_host='10.162.16.221',               
master_user='master',    
master_password='oracle',   
master_log_file='mysql-bin.000007',    
master_log_pos= 818254936;
start slave;
show slave status\G;
  • 以下可视情况设置:
    延迟同步设置:
stop slave;
change master to master_delay=600;
start slave;
show slave status \G
  • GTID复制异常的解决方法,主从复制使用的是GTID方式(误删除等处理)
stop slave;
set gtid_next='1023843c-fd6e-ee16-7083-f580b4a8af63:4';
begin;commit;
set gtid_next='automatic';
change master to master_delay=0;
  • 在两台从库启动slave
show   slave   status  \G
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容