Keepalived+DRBD+mysql+amoeba 雙主雙從高可用集羣

一、項目實驗拓撲圖;

 

二、項目重點;

DRBD 的概述:Distributed Replicated Block Device 是一個用軟件實現的、無共享的、服務器 之間鏡像塊設備內容的存儲複製解決方案。其核心功能通過 Linux 的內核實現,比文件系統 更加靠近操作系統內核及 IO 棧,drbd 共有兩部分組成:內核模塊和用戶空間的管理工具; DRBD 是由內核模塊和相關腳本而構成,用以構建高可用性的集羣。其實現方式是通過網絡 來鏡像整個設備。可以把它看作是一種網絡 RAID。它允許用戶在遠程機器上建立一個本地 塊設備的實時鏡像;

 

DRBD 的角色:

主:在主 DRBD 設備中可以進行不受限制的讀和寫的操作,他可用來創建和掛載文件系統、 初始化或者是直接 I/O 的快設備; 備:接收所有來自對等節點的更新,不能被應用也不能被讀寫訪問。主要目的是保持緩衝及 數據一致性。人工干預和管理程序的自動聚類算法都可以改變資源的角色。資源可以由被變 換爲主,以及主到備;

 

DRBD 原理圖:

 

DRBD 的特點: 實時性:當某個應用程序完成對數據的修改時,複製功能立即發生;

透明性:應用程序的數據存儲在鏡像塊設備上是獨立透明的,他們的數據在兩個節點上都保 存一份,因此,無論哪一臺服務器宕機,都不會影響應用程序讀取數據的操作,所以說是透 明的;

 

DRBD 的同步方式: 同步鏡像:表示當應用程序提交本地的寫操作後,數據後會同步寫到兩個節點上去; 異步鏡像:表示當應用程序提交寫操作後,只有當本地的節點上完成寫操作後,另一個節點 纔可以完成寫操作;

 

DRBD 的工作模式:

單主模式:任何資源在任何特定的時間,集羣中只存在一個主節點。 正是因爲這樣在集羣 中,只能有一個節點可以隨時操作數據,這種模式可用在任何的文件系統上( EXT3、 EXT4、 XFS 等等);

雙主模式:在雙主模式下(drbd8.0 後支持),任何資源在任何特定的時間,集羣中都存在兩 個主節點。猶豫雙方數據存在併發的可能性,這種模式需要一個共享的集羣文件系統,利用 分佈式的鎖機制進行管理,如 GFS 和 OCFS2。部署雙主模式時, DRBD 是負載均衡的集羣, 這就需要從兩個併發的主節點中選取一個首選的訪問數據。這種模式默認是禁用的,如果要 是用的話必須在配置文件中進行聲明;

 

DRBD 的同步協議:

協議 A:本地完成寫入,且數據包已在發送隊列中,則認爲寫入完成。在一 個節點發生故障 時,可能發生數據丟失,常用與物理上分開的節點;

協議 B:本地完成寫入,並收到遠程主機的收到數據確認後,則認爲寫入完成。在兩個節點 同時發生故障時,可能發生數據丟失。因爲在數據傳輸過程中, 數據未必能提交到磁盤; 協議 C:本地完成寫入,並收到遠程主機的寫入確認後,則認爲寫入完成,沒有任何數據丟 失,因此這是最常用的模式;

 

三、項目環境;

 

系統類型

IP 地址

主機名

所需軟件

Centos 7.4 1708 64bit

192.168.100.101

master1

mysql-5.6.36.tar.gz drbd84-utils

kmod-drbd84 drbd84-utils-sysvinit ntp

Centos 7.4 1708 64bit

192.168.100.102

master2

mysql-5.6.36.tar.gz drbd84-utils

kmod-drbd84 drbd84-utils-sysvinit ntpdate

Centos 7.4 1708 64bit

192.168.100.103

slave1

mysql-5.6.36.tar.gz ntpdate

Centos 7.4 1708 64bit

192.168.100.104

slave2

mysql-5.6.36.tar.gz ntpdate

Centos 7.4 1708 64bit

192.168.100.105

amoeba

amoeba-mysql-binary-2.2.0.tar.gz jdk-6u14-linux-x64.bin

Centos 7.4 1708 64bit

192.168.100.106

client

mysql

 

 

 

四、項目實驗步驟;

Ø 部署 master1 節點的 ntp 服務以及域名解析;

Ø 配置 master2、slave1、slave2 節點同步 ntp 時間及域名解析(在此只列舉 master2 單臺 主機配置);

  • 分別在 master1、master2、slave1、slave2 節點上安裝 mysql 服務(在此只列舉 master1

單臺主機配置);

Ø 分別在 master1、master2 節點上 drbd 服務(在此只列舉 master1 單臺主機配置);

Ø 配置優化 master1、master2 節點的 drbd 服務(在此只列舉 master1 單臺主機配置);

Ø 在 master1、master2 兩個節點準備 drbd 的磁盤(在此只列舉 master1 單臺主機配置);

Ø 在 master1 主節點上進行初始化 drbd 的塊設備並且進行測試掛載;

Ø 在 master2 從節點上測試掛載 drbd 塊設備;

Ø 配置 master1 節點的 mysql 服務數據文件的存放位置爲 drbd 塊設備的掛載點;

Ø 使用 master2 節點測試查看 mysql 中數據;

  • 安裝 master1、master2 節點的 keepalived 服務;
  • 配置 master1 節點上 master 主節點;
  • 配置 master 2 節點上 backup 從節點;
  • 配置 master1 節點 keepalived 服務切換 DRBD 塊設備;

Ø 配置 master1、master2 節點上的主從複製;

Ø 配置 slave1 節點的主從複製;

 

Ø 配置 slave2 節點的主從複製;

Ø 驗證 master1 節點、slave1 節點、slave2 節點的主從複製;

Ø 安裝 amoeba 數據庫代理程序;

Ø 配置 master1 節點授權 amoeba 節點連接數據庫集羣;

Ø 修改 amoeba 節點的配置文件並啓動測試;

Ø 客戶端訪問測試主從複製;

Ø 客戶端訪問測試讀寫分離;

Ø 關閉 master1 節點,測試雙主熱備情況;

 

 

 

 

Ø 部署 master1 節點的 ntp 服務以及域名解析; [root@master1 ~]# cat <<END >>/etc/hosts 192.168.100.101 master1

        1. master2
        2. slave1
        3. slave2 END

[root@master1 ~]# yum -y install ntp

[root@master1 ~]# sed -i '/^server/s/^/#/g' /etc/ntp.conf [root@master1 ~]# cat <<END >>/etc/ntp.conf

server 127.127.1.0

fudge 127.127.1.0 stratum 8 END

[root@master1 ~]# systemctl start ntpd [root@master1 ~]# systemctl enable ntpd

Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to

/usr/lib/systemd/system/ntpd.service.

 

Ø 配置 master2slave1slave2 節點同步 ntp 時間及域名解析(在此只列舉 master2 單臺 主機配置);

[root@master2 ~]# cat <<END >>/etc/hosts 192.168.100.101 master1

        1. master2
        2. slave1
        3. slave2 END

[root@master2 ~]# yum -y install ntpdate [root@master2 ~]# /usr/sbin/ntpdate 192.168.100.101

ech 9 Aug 18:04:38 ntpdate[1106]: adjust time server 192.168.100.101 offset 0.299673 sec [root@master2 ~]# echo "/usr/sbin/ntpdate 192.168.100.101">>/etc/rc.local [root@master2 ~]# chmod +x /etc/rc.local

 

  • 分別在 master1master2slave1slave2 節點上安裝 mysql 服務(在此只列舉 master1

單臺主機配置);

[root@master1 ~]# yum -y install ncurses cmake [root@master1 ~]# mount /dev/cdrom /mnt/ mount: /dev/sr0 寫保護,將以只讀方式掛載

[root@master1   ~]#   rpm   -ivh  /mnt/Packages/ncurses-devel-5.9-13.20130511.el7.x86_64.rpm

--nodeps [root@master1 ~]# ls mysql-5.6.36.tar.gz

[root@master1 ~]# tar zxvf mysql-5.6.36.tar.gz -C /usr/src/ [root@master1 ~]# cd /usr/src/mysql-5.6.36/

[root@master2 mysql-5.6.36]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql

-DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci

-DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1

-DWITH_BLACKHOLE_STORAGE_ENGINE=1  -DENABLE_DOWNLOADS=1

[root@master1 mysql-5.6.36]# make [root@master1 mysql-5.6.36]# make install [root@master1 mysql-5.6.36]# cd

[root@master1 ~]# cp /usr/src/mysql-5.6.36/support-files/mysql.server /etc/init.d/ [root@master1 ~]# chmod +x /etc/init.d/mysql.server

[root@master1 ~]# cat <<END >>/usr/lib/systemd/system/mysqld.service [Unit]

Description=mysqldapi After=network.target

 

[Service] Type=forking

PIDFile=/usr/local/mysql/logs/mysqld.pid ExecStart=/etc/init.d/mysql.server start ExecReload=/etc/init.d/mysql.server restart ExecStop=/etc/init.d/mysql.server stop PrivateTmp=Flase

 

[Install]

WantedBy=multi-user.target END

[root@master1 ~]# echo "export PATH=$PATH:/usr/local/mysql/bin/" >>/etc/profile [root@master1 ~]# source /etc/profile

[root@master1 ~]# groupadd mysql [root@master1 ~]# useradd -g mysql mysql [root@master1 ~]# cat <<END >/etc/my.cnf [mysqld]

basedir = /usr/local/mysql datadir = /usr/local/mysql/data

 

port = 3306 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

character_set_server=utf8 init_connect='SET NAMES utf8'

log-error=/usr/local/mysql/logs/mysqld.log pid-file=/usr/local/mysql/logs/mysqld.pid skip-name-resolve

END

[root@master1 ~]# mkdir /usr/local/mysql/logs [root@master1 ~]# chown mysql:mysql /usr/local/mysql/ -R

[root@master1 ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql

--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data [root@master1 ~]# systemctl start mysqld

[root@master1 ~]# systemctl enable mysqld

Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to

/usr/lib/systemd/system/mysqld.service. [root@master1 ~]# netstat -utpln |grep 3306

tcp 0 0   0.0.0.0:3306 0.0.0.0:* LISTEN

31481/mysqld

[root@master1 ~]# mysqladmin -uroot password 123123

Warning: Using a password on the command line interface can be insecure. [root@master1 ~]# mysql -uroot -p123123

mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| mysql |

| performance_schema |

| test |

+--------------------+

mysql> exit

 

Ø 分別在 master1master2 節點上 drbd 服務(在此只列舉 master1 單臺主機配置); [root@master1 ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

[root@master1 ~]# yum -y install epel-release

[root@master1 ~]# yum -y install perl-TimeDate kernel-devel kernel-headers flex resource-agents

[root@master1 ~]# rpm -ivh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm [root@master1 ~]# yum install -y drbd84-utils kmod-drbd84 drbd84-utils-sysvinit

 

Ø 配置優化 master1master2 節點的 drbd 服務(在此只列舉 master1 單臺主機配置);

[root@master1 ~]# cp /usr/lib/modules/3.10.0-862.el7.x86_64/extra/drbd84/drbd.ko

 

/lib/modules/$(uname -r)/kernel/lib [root@master1 ~]# depmod [root@master1 ~]# cat /etc/drbd.conf

# You can find an example in /usr/share/doc/drbd.../drbd.conf.example include "drbd.d/global_common.conf";

include "drbd.d/*.res";

[root@master1 ~]# cp /etc/drbd.d/global_common.conf{,-$(date +%s)} [root@master1 ~]# ls /etc/drbd.d/

global_common.conf global_common.conf-1533828130 [root@master1 ~]# vi /etc/drbd.d/global_common.conf global {

usage-count yes;

}

 

common {

startup {

 

 

 

}

options {

 

}

disk {

 

}

 

net {

 

}

}

 

 

 

wfc-timeout 120;

degr-wfc-timeout 120;

 

 

 

# cpu-mask on-no-data-accessible

 

 

 

on-io-error detach;

 

 

 

 

protocol C;

 

[root@master1 ~]# vi /etc/drbd.d/r0.res resource r0 {

on master1 {

device /dev/drbd0; disk /dev/sdb1;

address 192.168.100.101:7788;

meta-disk internal;

}

on master2 {

device /dev/drbd0; disk /dev/sdb1;

address 192.168.100.102:7788;

meta-disk internal;

}

}

 

 

Ø  master1master2 兩個節點準備 drbd 的磁盤(在此只列舉 master1 單臺主機配置);

[root@master1 ~]# fdisk /dev/sdb n--p--1--回車--回車--p--w

[root@master1 ~]# yum -y install parted [root@master1 ~]# partprobe /dev/sdb [root@master1 ~]# partprobe /dev/sdb1

[root@master1 ~]# dd if=/dev/zero of=/dev/sdb1 bs=1M count=1

記錄了 1+0 的讀入

記錄了 1+0 的寫出

1048576 字節(1.0 MB)已複製,0.00917599  秒,114 MB/秒

[root@master1 ~]# drbdadm create-md r0 ##創建 drbd 磁盤,注意 master1  和 master2

的主機名必須更改,不然導致報錯

you are the 1649th user to install this version initializing activity log

initializing bitmap (640 KB) to all zero Writing meta data...

New drbd meta data block successfully created.

[root@master1 ~]# /etc/init.d/drbd start ##如若出現無法加載 drbd 模塊,重啓主機可 以解決

...

To abort waiting enter 'yes' [ 12]: yes

...

[root@master1 ~]# netstat -anpt |grep 7788 ##當 master1 單個節點服務啓動的狀態

tcp 0 0 192.168.100.101:7788 0.0.0.0:* LISTEN -

[root@master2 ~]# netstat -anpt |grep 7788 ##當 master1 和 master2 兩個節點服務同時啓 動的狀態

 

tcp

0

0 192.168.100.102:7788

192.168.100.101:56853

ESTABLISHED -

tcp

0

0 192.168.100.102:34126

192.168.100.101:7788

ESTABLISHED -

 

Ø  master1 主節點上進行初始化 drbd 的塊設備並且進行測試掛載; [root@master1 ~]# drbdadm -- --overwrite-data-of-peer primary r0 [root@master1 ~]# cat /proc/drbd ##等待其初始化完成 version: 8.4.11-1 (api:1/proto:86-101)

GIT-hash: 66145a308421e9c124ec391a7848ac20203bb03c build by mockbuild@, 2018-04-26 12:10:42

0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----

ns:301636 nr:0 dw:0 dr:303740 al:8 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:20668184 [>....................] sync'ed: 1.5% (20180/20476)M

finish: 0:23:53 speed: 14,408 (10,772) K/sec [root@master1 ~]# mkfs -t xfs /dev/drbd0

meta-data=/dev/drbd0 isize=512 agcount=4, agsize=1310614 blks

= sectsz=512 attr=2, projid32bit=1

= crc=1 finobt=0, sparse=0

 

data = bsize=4096 blocks=5242455, imaxpct=25

= sunit=0 swidth=0 blks naming =version 2 bsize=4096 ascii-ci=0 ftype=1

log =internal log bsize=4096 blocks=2560, version=2

= sectsz=512 sunit=0 blks, lazy-count=1 realtime =none extsz=4096 blocks=0, rtextents=0 [root@master1 ~]# mkdir /mysqldata

[root@master1 ~]# mount /dev/drbd0 /mysqldata/ [root@master1 ~]# mount |tail -1

/dev/drbd0 on /mysqldata type xfs (rw,relatime,attr2,inode64,noquota) [root@master1 ~]# echo "ceshi" >>/mysqldata/ceshi.txt  [root@master1 ~]# cat /mysqldata/ceshi.txt

ceshi

[root@master1 ~]# umount /mysqldata/ [root@master1 ~]# drbdadm secondary r0

 

Ø  master2 從節點上測試掛載 drbd 塊設備; [root@master2 ~]# drbdadm primary r0 [root@master2 ~]# mkdir /mysqldata [root@master2 ~]# mount /dev/drbd0 /mysqldata/ [root@master2 ~]# mount |tail -1

/dev/drbd0 on /mysqldata type xfs (rw,relatime,attr2,inode64,noquota) [root@master2 ~]# cat /mysqldata/ceshi.txt

ceshi

[root@master2 ~]# umount /mysqldata/ [root@master2 ~]# drbdadm secondary r0

 

Ø 配置 master1 節點的 mysql 服務數據文件的存放位置爲 drbd 塊設備的掛載點;

[root@master1 ~]# drbdadm primary r0 [root@master1 ~]# mount /dev/drbd0 /mysqldata/ [root@master1 ~]# ls /mysqldata/

ceshi.txt

[root@master1 ~]# sed -i 's/\/usr\/local\/mysql\/data/\/mysqldata\/mysql/g' /etc/my.cnf [root@master1 ~]# grep mysqldata /etc/my.cnf

datadir = /mysqldata/mysql

[root@master1 ~]# chown -R mysql:mysql /mysqldata/ [root@master1 ~]# systemctl stop mysqld

[root@master1 ~]# /usr/local/mysql/scripts/mysql_install_db --user=mysql

--basedir=/usr/local/mysql --datadir=/mysqldata/mysql [root@master1 ~]# systemctl start mysqld [root@master1 ~]# ls /mysqldata/mysql/

auto.cnf ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema test [root@master1 ~]# mysqladmin -uroot password 123123

Warning: Using a password on the command line interface can be insecure.

 

[root@master1 ~]# mysql -uroot -p123123 mysql> exit

[root@master1 ~]# systemctl stop mysqld [root@master1 ~]# umount /mysqldata/ [root@master1 ~]# drbdadm secondary r0

 

Ø 使用 master2 節點測試查看 mysql 中數據; [root@master2 ~]# drbdadm primary r0 [root@master2 ~]# mount /dev/drbd0 /mysqldata/

[root@master2 ~]# sed -i 's/\/usr\/local\/mysql\/data/\/mysqldata\/mysql/g' /etc/my.cnf [root@master2 ~]# grep mysqldata /etc/my.cnf

datadir = /mysqldata/mysql

[root@master2 ~]# chown -R mysql:mysql /mysqldata/ [root@master2 ~]# systemctl restart mysqld [root@master2 ~]# mysql -uroot -p123123

mysql> exit

[root@master2 ~]# systemctl stop mysqld [root@master2 ~]# umount /mysqldata/ [root@master2 ~]# drbdadm secondary r0 [root@master1 ~]# drbdadm primary r0 [root@master1 ~]# mount /dev/drbd0 /mysqldata/ [root@master1 ~]# systemctl start mysqld

 

  • 安裝 master1master2 節點的 keepalived 服務; [root@master1 ~]# yum -y install kernel-devel openssl-devel popt-devel [root@master1 ~]# tar -zxvf keepalived-1.2.13.tar.gz -C /usr/src/ [root@master1 ~]# cd /usr/src/keepalived-1.2.13/

[root@master1 keepalived-1.2.13]# ./configure --prefix=/usr/local/keepalived [root@master1 keepalived-1.2.13]# make &&make install

[root@master1 keepalived-1.2.13]# cd

[root@master1 ~]# mkdir -p /etc/keepalived ##程序的主配置目錄 [root@master1 ~]# cp /usr/local/keepalived/etc/keepalived/keepalived.conf /etc/keepalived/## 複製主配置文件

[root@master1 ~]# cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/ ##

複製啓動時需要加載的配置文件

[root@master1 ~]# cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/init.d/ ## 複製 服務的控制腳本

[root@master1 ~]# cp /usr/local/keepalived/sbin/keepalived /usr/sbin/ ## 復 制

keepalived 的命令

[root@master1 ~]# chmod 755 /etc/init.d/keepalived ##爲控制腳本指定權限

 

  • 配置 master1 節點上 master 主節點; [root@master1 ~]# vi /etc/keepalived/keepalived.conf global_defs {

 

router_id HA_TEST_R1 ##本服務器的名稱,若環境中有多個 keepalived 時,此名稱 不能一致

}

vrrp_instance VI_1 { ##定義 VRRP 熱備實例,每一個 keep 組都不同

state MASTER ##MASTER 表示主服務器

interface eth0 ##承載 VIP 地址的物理接口

virtual_router_id 1 ##虛擬路由器的 ID 號,每一個 keep 組都不同

priority 100 ##優先級,數值越大優先級越高

advert_int 1 ##通告檢查間隔秒數(心跳頻率)

authentication { ##認證信息 auth_type PASS ##認證類型 auth_pass 123456 ##密碼字串

}

virtual_ipaddress {

192.168.100.95 ##指定漂移地址(VIP)

}

}

:wq

[root@master1 ~]# /etc/init.d/keepalived start

Starting keepalived (via systemctl): [ 確定 ] [root@master1 ~]# ip a |grep 192.168.100.95

inet 192.168.100.95/32 scope global eth0

 

  • 配置 master 2 節點上 backup 從節點; [root@master2 ~]# vi /etc/keepalived/keepalived.conf global_defs {

router_id HA_TEST_R2 ##本服務器的名稱

}

vrrp_instance VI_1 {

state BACKUP ##BACKUP 表示從服務器

interface eth0 virtual_router_id 1

priority 99 ##優先級,低於主服務器

advert_int 1 authentication {

auth_type PASS auth_pass 123456

}

virtual_ipaddress { 192.168.100.95

}

}

:wq

[root@master2 ~]# /etc/init.d/keepalived start

 

Starting keepalived (via systemctl): [ 確定 ] [root@master2~]# ip a |grep 192.168.100.95

 

  • 配置 master1 節點 keepalived 服務切換 DRBD 塊設備;

[root@master1 ~]# yum -y install expect [root@master1 ~]# vi /etc/keepalived/drbd.sh

#!/bin/bash while true;do

VIP=$(ip a |grep 192.168.100.95 |wc -l) if [ $VIP -eq 0 ];then

/etc/init.d/keepalived start sleep 2

VIP=$(ip a |grep 192.168.100.95 |wc -l) if [ $VIP -eq 0 ];then

systemctl stop mysqld sleep 2

fi

fi

MYSQLD=$(ps aux |grep mysqld |grep -v grep |wc -l) if [ $MYSQLD -eq 0 ];then

/etc/init.d/keepalived stop

echo "mysql stats is down on $(date +%F-%T)" >>/var/log/mysqld.stats sleep 2

umount /mysqldata sleep 2

drbdadm secondary r0

/etc/keepalived/expect.sh 192.168.100.102 root pwd@123  "drbdadm primary r0 &&    mount

/dev/drbd0 /mysqldata && systemctl start mysqld"

echo "mysql is already switched master2 on $(date +%F-%T)" >>/var/log/mysqld.stats

fi done

 

[root@master1 ~]# vi /etc/keepalived/expect.sh

#!/usr/bin/expect

set ip [lindex $argv 0] set user [lindex $argv 1]

set password [lindex $argv 2] set com [lindex $argv 3]

set timeout 10

spawn ssh $user@$ip $com expect {

"*yes/no" { send "yes\r"; exp_continue} "*password:" { send "$password\r" }

}

 

interact

 

[root@master1 ~]# chmod +x /etc/keepalived/drbd.sh [root@master1 ~]# chmod +x /etc/keepalived/expect.sh [root@master1 ~]# /etc/keepalived/drbd.sh & [root@master1 ~]# jobs -l

[1]+ 4349 running /etc/keepalived/drbd.sh

 

Ø 配置 master1master2 節點上的主從複製;

[root@master1 ~]# cat <<END >>/etc/my.cnf server-id=1

log-bin=mysql-bin

log-slave-updates=true END

[root@master1 ~]# systemctl restart mysqld [root@master1 ~]# mysql -uroot -p123123

mysql> grant replication slave on *.* to 'myslave'@'192.168.100.%' identified by '123123'; Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec) mysql> show master status;

+------------------+----------+--------------+------------------+-------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

|   mysql-bin.000001  | 412   | | |

|

+------------------+----------+--------------+------------------+-------------------+

mysql> exit

 

[root@master2 ~]# cat <<END >>/etc/my.cnf server-id=1

log-bin=mysql-bin

log-slave-updates=true END

 

Ø 配置 slave1 節點的主從複製; [root@slave1 ~]# cat <<END >>/etc/my.cnf server-id=2

relay-log=relay-log-bin

relay-log-index=slave-relay-bin.index END

[root@slave1 ~]# systemctl restart mysqld [root@slave1 ~]# mysql -uroot -p123123

mysql> change master to

 

master_host='192.168.100.95',master_user='myslave',master_password='123123',master_log_fil e='mysql-bin.000001',master_log_pos=412;

Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql> start slave;

Query OK, 0 rows affected (0.00 sec) mysql> show slave status\G;

*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.100.95 Master_User: myslave Master_Port: 3306

Connect_Retry: 60 Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 412 Relay_Log_File: relay-log-bin.000002 Relay_Log_Pos: 283

Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes

mysql> exit

 

Ø 配置 slave2 節點的主從複製; [root@slave2 ~]# cat <<END >>/etc/my.cnf server-id=3

relay-log=relay-log-bin

relay-log-index=slave-relay-bin.index END

[root@slave2 ~]# systemctl restart mysqld [root@slave2 ~]# mysql -uroot -p123123

mysql> change master to master_host='192.168.100.95',master_user='myslave',master_password='123123',master_log_fil e='mysql-bin.000001',master_log_pos=412;

Query OK, 0 rows affected, 2 warnings (0.02 sec) mysql> start slave;

Query OK, 0 rows affected (0.00 sec) mysql> show slave status\G;

*************************** 1. row *************************** Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.100.95 Master_User: myslave Master_Port: 3306

Connect_Retry: 60 Master_Log_File: mysql-bin.000001

Read_Master_Log_Pos: 412

 

Relay_Log_File: relay-log-bin.000002 Relay_Log_Pos: 283

Relay_Master_Log_File: mysql-bin.000001 Slave_IO_Running: Yes Slave_SQL_Running: Yes

mysql> exit

 

Ø 驗證 master1 節點、slave1 節點、slave2 節點的主從複製;

[root@master1 ~]# mysql -uroot -p123123 mysql> create database linuxfan1;

Query OK, 1 row affected (0.00 sec) mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| linuxfan |

| linuxfan1 |

| mysql |

| performance_schema |

| test |

+--------------------+

6 rows in set (0.00 sec) mysql> exit

 

[root@slave1 ~]# mysql -uroot -p123123 mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| linuxfan |

| linuxfan1 |

| mysql |

| performance_schema |

| test |

+--------------------+

6 rows in set (0.00 sec) mysql> exit

 

[root@slave2 ~]# mysql -uroot -p123123 mysql> show databases;

+--------------------+

| Database |

 

+--------------------+

| information_schema |

| linuxfan |

| linuxfan1 |

| mysql |

| performance_schema |

| test |

+--------------------+

6 rows in set (0.00 sec) mysql> exit

 

Ø 安裝 amoeba 數據庫代理程序;

[root@amoeba ~]# ls

amoeba-mysql-binary-2.2.0.tar.gz jdk-6u14-linux-x64.bin [root@amoeba ~]# chmod +x jdk-6u14-linux-x64.bin [root@amoeba ~]# ./jdk-6u14-linux-x64.bin [root@amoeba ~]# mv jdk1.6.0_14/ /usr/local/jdk1.6 [root@amoeba ~]# vi /etc/profile

export JAVA_HOME=/usr/local/jdk1.6

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin export AMOEBA_HOME=/usr/local/amoeba

export PATH=$PATH:$AMOEBA_HOME

:wq

[root@amoeba ~]# source /etc/profile [root@amoeba ~]# java --version Unrecognized option: --version

Could not create the Java virtual machine. [root@amoeba ~]# java -version

java version "1.6.0_14"

Java(TM) SE Runtime Environment (build 1.6.0_14-b08)

Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)

 

Ø 配置 master1 節點授權 amoeba 節點連接數據庫集羣;

[root@master1 ~]# mysql -uroot -p123123

mysql> grant all on *.* to 'amoeba'@'192.168.100.%' identified by '123123'; Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;

Query OK, 0 rows affected (0.00 sec) mysql> exit

 

Ø 修改 amoeba 節點的配置文件並啓動測試;

[root@amoeba ~]# mkdir /usr/local/amoeba

[root@amoeba ~]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/

 

[root@amoeba ~]# chmod -R 755 /usr/local/amoeba/ [root@amoeba ~]# vi /usr/local/amoeba/conf/amoeba.xml

30 <property  name="user">admin</property> 31

32 <property  name="password">admin</property>

 

 

 

 

 

 

 

 

:wq

115 <property  name="defaultPool">master</property> 116

117

  1. <property name="writePool">master</property>
  2. <property name="readPool">slaves</property>

 

[root@amoeba ~]# vi /usr/local/amoeba/conf/dbServers.xml

    1. <!-- mysql port -->
    2. <property name="port">3306</property> 21
  1. <!-- mysql schema -->
  2. <property name="schema">test</property> 24
  1. <!-- mysql user -->
  2. <property name="user">amoeba</property> 27
  1. <!-- mysql password -->
  2. <property name="password">123123</property>

 

  1. <dbServer name="master" parent="abstractServer">
  2. <factoryConfig>
  3. <!-- mysql ip -->
  4. <property name="ipAddress">192.168.100.95</property>
  5. </factoryConfig>
  6. </dbServer> 51
  1. <dbServer name="slave1" parent="abstractServer">
  2. <factoryConfig>
  3. <!-- mysql ip -->
  4. <property name="ipAddress">192.168.100.103</property>
  5. </factoryConfig>
  6. </dbServer> 58
  1. <dbServer name="slave2" parent="abstractServer">
  2. <factoryConfig>
  3. <!-- mysql ip -->
  4. <property name="ipAddress">192.168.100.104</property>
  5. </factoryConfig>

 

 

64

</dbServer>

 

66

<dbServer name="slaves" virtual="true">

 

67

 

<poolConfig

class="com.meidusa.amoeba.server.MultipleServerPool">

  1. <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->
  2. <property name="loadbalance">1</property> 70
  1. <!-- Separated by commas,such as:

server1,server2,server1 -->

  1. <property name="poolNames">slave1,slave2</property>
  2. </poolConfig>
  3. </dbServer>

:wq

[root@amoeba ~]# /usr/local/amoeba/bin/amoeba start & [1] 1237

 

Ø 客戶端訪問測試主從複製;

[root@client ~]# yum -y install mysql

[root@client ~]# mysql -uadmin -padmin -h192.168.100.105 -P 8066 MySQL [(none)]> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| linuxfan |

| linuxfan1 |

| mysql |

| performance_schema |

| test |

+--------------------+

MySQL [(none)]> create database linuxfan2; Query OK, 1 row affected (0.01 sec)

MySQL [(none)]> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| linuxfan |

| linuxfan1 |

| linuxfan2 |

| mysql |

| performance_schema |

 

| test |

+--------------------+

MySQL [(none)]> use linuxfan2; Database changed

MySQL [linuxfan]> create table t1(id int,name varchar(8)); Query OK, 0 rows affected (0.02 sec)

MySQL [linuxfan]> insert into t1 values(1,'tom'); Query OK, 1 row affected (0.01 sec)

MySQL [linuxfan]> select * from t1;

+------+------+

| id | name |

+------+------+

| 1 | tom |

+------+------+

MySQL [(none)]> exit

 

[root@master1 ~]# mysql -uroot -p123123 mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| linuxfan |

| linuxfan1 |

| linuxfan2 |

| mysql |

| performance_schema |

| test |

+--------------------+

mysql> exit

 

[root@slave1 ~]# mysql -uroot -p123123 mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| linuxfan |

| linuxfan1 |

| linuxfan2 |

| mysql |

| performance_schema |

| test |

+--------------------+

 

mysql> exit

 

[root@slave2 ~]# mysql -uroot -p123123 mysql> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| linuxfan |

| linuxfan1 |

| linuxfan2 |

| mysql |

| performance_schema |

| test |

+--------------------+

mysql> exit

 

Ø 客戶端訪問測試讀寫分離; [root@slave1 ~]# mysql -uroot -p123123 mysql> stop slave;

Query OK, 0 rows affected (0.00 sec) mysql> use linuxfan2;

Database changed

mysql> insert into t1 values(2,'jack'); Query OK, 1 row affected (0.00 sec) mysql> select * from t1;

+------+------+

| id | name |

+------+------+

| 1 | tom |

| 2 | jack |

+------+------+

mysql> exit

 

[root@slave2 ~]# mysql -uroot -p123123 mysql> stop slave;

Query OK, 0 rows affected (0.01 sec) mysql> use linuxfan2;

Database changed

mysql> insert into t1 values(3,'marry'); Query OK, 1 row affected (0.00 sec) mysql> select * from t1;

+------+-------+

| id | name |

 

+------+-------+

| 1 | tom |

| 3 | marry |

+------+-------+

mysql> exit

 

[root@client ~]# mysql -uadmin -padmin -h192.168.100.105 -P 8066 MySQL [(none)]> use linuxfan2;

Database changed

MySQL [linuxfan2]> insert into t1 values(4,'kali'); Query OK, 1 row affected (0.01 sec)

MySQL [linuxfan2]> select * from t1;

+------+------+

| id | name |

+------+------+

| 1 | tom |

| 2 | jack |

+------+------+

MySQL [linuxfan2]> select * from t1;

+------+-------+

| id | name |

+------+-------+

| 1 | tom |

| 3 | marry |

+------+-------+

MySQL [linuxfan2]> exit

 

Ø 關閉 master1 節點,測試雙主熱備情況; [root@master1 ~]# /etc/keepalived/drbd.sh & [1] 51212

[root@master1 ~]# systemctl stop mysqld

[root@master1 ~]# Stopping keepalived (via systemctl): [ 確定 ]

spawn ssh [email protected] drbdadm primary r0 && mount /dev/drbd0 /mysqldata && systemctl start mysqld

...

 

[root@master2 ~]# ip a|grep 192.168.100.95 inet 192.168.100.95/32 scope global eth0

[root@master2 ~]# ls /mysqldata/ ceshi.txt mysql

[root@master2 ~]# netstat -utpln |grep 3306

tcp 0 0   0.0.0.0:3306 0.0.0.0:* LISTEN

8037/mysqld

 

[root@client ~]# mysql -uadmin -padmin -h192.168.100.105 -P 8066 MySQL [(none)]> show databases;

+--------------------+

| Database |

+--------------------+

| information_schema |

| linuxfan |

| linuxfan1 |

| linuxfan2 |

| mysql |

| performance_schema |

| test |

+--------------------+

MySQL [(none)]> exit

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章