資源清單:
伺服器:兩台
配置:系統: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即可 。