MySQL主備集群搭建

1. 搭建前環(huán)境檢查

(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完整狀態(tài)
##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的話,需要重啟系統(tǒng)。反過來也一樣。
##enforcing和permissive模式可以通過setenforce1|0命令快速切換。
##需要注意的是,如果系統(tǒng)已經在關閉SELinux的狀態(tài)下運行了一段時間,在打開SELinux之后的第一次重啟速度可能會比較慢。因為系統(tǒng)必須為磁盤中的文件創(chuàng)建安全上下文(我表示我重啟了大約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

###將分區(qū)設置成gpt格式
## parted  /dev/sdc mklabel gpt
###創(chuàng)建一個20G的分區(qū)
##parted /dev/sdc mkpart primary 0 20000
###將剩余的空間全部創(chuàng)建成一個擴展分區(qū) 
## parted /dev/sdc mkpart extended 1 100%
##/dev/sdd分區(qū)分成1個分區(qū)
##parted /dev/sdd mklabel gpt
##parted /dev/sdd mkpart primary 0 100%
##將硬盤分為兩個主分區(qū)
##[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                       #打印當前分區(qū)
##(parted) mkpart primary 0 4.5TB                # 分一個4.5T的主分區(qū)
##(parted) mkpart primary 4.5TB 12TB      # 分一個7.5T的主分區(qū)
##(parted) print                         #打印當前分區(qū)
##(parted) quit 退出

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

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

#一、如果是使用yum安裝的mysql,使用如下命令進行卸載(不能確定使用何種方式安裝的mysql情況下,按后續(xù)步驟一一進行處理即可):
## 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,按如下步驟進行處理:
#查看系統(tǒng)中是否以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上創(chuàng)建公鑰和密鑰
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節(jié)點(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節(jié)點(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#多個節(jié)點不能重復
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##執(zhí)行備份的表
replicate_wild_ignore_table#備份過程中忽略的表
replicate_wild_ignore_table=information_schema.%
replicate_wild_ignore_table=performance_schema.%
#replicate-do-db=databasename1,databasename2#執(zhí)行備份的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密碼,創(chuàng)建主從庫復制用戶master:

#在my.cnf中添加
#skip-grant-tables=1
#重啟mysql
#登錄進入數據庫執(zhí)行
#flush privileges;
#set password for root@localhost = password('1');
# flush privileges;
#***改完密碼要把配置改回來,再重啟
set global validate_password_policy=0;
set global validate_password_length=4;
##可能執(zhí)行不成功,對密碼格式的要求,可忽略
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. 主從同步設置:

  • 到主庫中執(zhí)行(使用root登錄執(zhí)行) :
show  master  status \G
  • 到從庫中執(zhí)行:
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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容