NO IMAGE

vim /etc/vsftpd/vsftpd.conf
systemctl start vsftpd
scp ks7.cfg 192.168.1.5:/var/ftp/
 
yum  -y  install  dhcp
vim  /etc/dhcp/dhcpd.conf
subnet 192.168.1.0 netmask 255.255.255.0 {
     range  192.168.1.10 192.168.1.200;
     next-server  192.168.1.20;
     option routers 192.168.1.254;
     filename  “pxelinux.0”;}
 
 dhclient  -d  eth0
yum -y install tftp-server
yum  -y  install  syslinux-tftpboot.x86_64    
/var/lib/tftpboot
mkdir pxelinux.cfg
 rpm  -ql  syslinux  |  grep pxelinux.0
cp  /usr/share/syslinux/pxelinux.0  /var/lib/tftpboot/
mkdir  /var/lib/tftpboot/rhel7
lftp 192.168.1.254:/ansible/images/pxeboot>
get vmlinuz initrd.img     isolinux.cfg
yum  -y  install  tftp
systemctl start dhcpd
   96  ss -ltun
   97  systemctl start tftp
system-config-kickstart
tftp  192.168.1.5  -c  get pxelinux.0
/var/www/html
 
ss -anputl | grep dns
  477  killall dnsmasq
 
default vesamenu.c32
timeout 600
label linux
  menu label ^Install CentOS 7
  kernel vmlinuz
  append initrd=initrd.img ks=ftp://192.168.1.19/ks7.cfg console=ttyS0,115200n8
實驗目的:搭建一個高可用,高併發的SNS類網站
虛擬機器講解,演示,一臺企業中真實的伺服器是什麼樣子的。
kickstart 檔案解說,配置 PXE 網路裝機環境 (kickstart 檔案見附件 conf/ks7.ks)
                                            學生需要使用該配置檔案安裝虛擬機器
pxe 配置
    dhcpd    配置詳情見附件 (dhcpd/dhcpd.conf,subnet-192.168)
    vsftp    配置詳情見附件 (vsftpd.conf)
    tftpboot 配置詳情見附件 (tftpboot/pxelinux.cfg/default,centos_menu)
 
    簡易配置軟體 dnsmasq.conf 簡介
    實驗一:
            修改 ks7.ks 配置檔案,配置自己的 pxe 環境,配置 yum 源,安裝 guest 作業系統
        學生實驗在 KVM 中完成
 
            virt-install 安裝 guest os
        virt-install \
            –connect qemu:///system –virt-type kvm \
            –name demo –memory 2048 –cpu host –vcpus 2 –os-variant centos7.0 \
            –network bridge=vbr0 \
            –disk path=/var/lib/libvirt/images/demo.qcow2,bus=scsi \
            –boot menu=on,useserial=on –nographics –pxe
 
            virsh xml 配置檔案定義,bridge 配置
        配置檔案詳見 demo.xml
 
 
        克隆虛擬機器
        qemu-img create -b background.qcow2 -f qcow2 node.img
        sed ‘s,demo,node,’ demo.xml >node.xml
        virsh -c qemu:///system define node.xml
        virsh -c qemu:///system start –console node
 
 
    實驗二:
            以新安裝的系統為模板,安裝 Linux Nginx mysql php (fastcgi)
        Nginx 安裝編譯引數(rpm 詳見 spec 檔案)
        新增 web 使用者和組
        groupadd -g 1000 web
        useradd -u 1000 -g 1000 web -s /sbin/nologin
        新增編譯依賴庫
        yum install openssl-devel pcre-devel readhline-devel zlib-devel
 
        ./configure –prefix=/usr/local/nginx \  # 安裝路徑
        –with-http_ssl_module \                 # 開啟 ssl 模組 支援https
        –with-http_v2_module \                  # 支援 http_v2 協議
        –with-http_realip_module \              # 獲取客戶端真實 ip
        –with-http_stub_status_module \         # 檢視伺服器工作狀態
        –without-mail_pop3_module \             # 禁用 pop3 模組
        –without-mail_imap_module \             # 禁用 imap 模組
        –without-mail_smtp_module \             # 禁用 smtp 模組
        –with-pcre                              # 開啟 pcre 正規表示式支援
 
            配置檔案 nginx.conf
        user  web web;
        worker_processes  auto;
        worker_rlimit_nofile 16384;
 
        events {
            use epoll;
        worker_connections 8192;
        }
        pid /var/run/nginx.pid;
 
            php   安裝編譯引數(rpm 詳見 spec 檔案)
        ./configure –prefix=/usr/local/php –with-config-file-path=/etc \ # 安裝及配置檔案路徑
        –with-fpm-user=web –with-fpm-group=web \                         # 使用者和組設定
        –enable-fd-setsize=65535 –disable-ipv6 \                         # 禁用 ipv6,和設定 openfile  
        –without-sqlite3 –without-pdo-sqlite \                           # 禁用 sqlite
        –enable-fpm \                                                     # 開啟 fpm 模式支援
        –enable-sockets –enable-sysvsem –enable-sysvshm –enable-sysvmsg –enable-shmop –enable-mbstring –enable-zip –enable-bcmath –enable-ftp –enable-soap –with-mhash –with-pcre-regex –with-pcre-dir –with-readline –with-zlib –with-curl –with-openssl –with-iconv –with-gd –with-png-dir –with-jpeg-dir –with-freetype-dir –with-xpm-dir \               # php功能特性
        –enable-mysqlnd –with-mysqli=mysqlnd –with-pdo-mysql=mysqlnd    # 開啟 mysql 支援
 
        php-fpm 配置檔案
        [global]
        pid = /var/run/php-fpm.pid
        error_log = /var/log/weblog/php-fpm.log
        log_level = warning
        emergency_restart_threshold = 10
        emergency_restart_interval = 1d
        process.max = 2048
        daemonize = yes
        rlimit_files = 65535
 
            user = web
        group = web
        listen = /var/run/php-fpm.sock
        listen.backlog = 1024
        listen.owner = web
        listen.group = web
        listen.mode = 0660
        pm = ondemand
        pm.max_children = 2048
        pm.process_idle_timeout = 60s;
        pm.max_requests = 2048
        request_terminate_timeout = 180
 
        nginx fastcgi 配置
        location ~ ^/(. \.php)$ {
                fastcgi_pass   unix:/var/run/php-fpm.sock;
                fastcgi_index  index.php;
                include        fastcgi.conf;
            }
 
            驗證配置 info.php
        <?PHP
          phpinfo();

        ?>

#platform=x86, AMD64, or Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install
# Keyboard layouts
keyboard ‘us’
# Root password
rootpw –iscrypted lxqk4My6q5YyQ
# System timezone
timezone Asia/Shanghai
# Use network installation
url –url=”ftp://192.168.1.254/centos7″
# System language
lang en_US.UTF-8
# Firewall configuration
firewall –disabled
# System authorization information
auth  –useshadow  –passalgo=sha512
# Use text mode install
text
# Installation logging level
logging –level=warning
# Run the Setup Agent on first boot
firstboot –disable
# SELinux configuration
selinux –disabled
# Do not configure the X Window System
skipx
# Network information
network –device=bootif –onboot=on –hostname=localhost –bootproto=bootp –noipv6
# Reboot after installation
reboot
# System bootloader configuration
bootloader –location=mbr
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart –all –initlabel
# Disk partitioning information
part /boot –asprimary –fstype=xfs –size=512
part /     –asprimary –fstype=xfs –size=1 –grow

%packages –nobase
@Core –nodefaults
-iwl3160-firmware
-iwl6000g2b-firmware
-iwl2030-firmware
-iwl7265-firmware
-iwl1000-firmware
-iwl4965-firmware
-iwl2000-firmware
-iwl3945-firmware
-alsa-tools-firmware
-aic94xx-firmware
-iwl135-firmware
-iwl7260-firmware
-iwl6050-firmware
-iwl6000g2a-firmware
-iwl5000-firmware
-ivtv-firmware
-iwl100-firmware
-iwl5150-firmware
-iwl105-firmware
-iwl6000-firmware
-alsa-firmware
-postfix
-audit
-tuned
chrony
psmisc
net-tools
screen
vim-enhanced
tcpdump
lrzsz
ltrace
strace
traceroute
whois
bind-utils
tree
mlocate
rsync
lsof
lftp
patch
diffutils
cpio
time
nmap
socat
man-pages
rpm-build
createrepo
%end

%pre
%end

%post –interpreter=/bin/bash
rm -f /etc/yum.repos.d/*.repo
cat >/etc/yum.repos.d/local.repo <<‘EOF’
[local_repo]
name=CentOS-$releasever – Base
baseurl=ftp://192.168.1.254/centos7
enabled=1
gpgcheck=1
EOF
rpm -import ftp://192.168.1.254/centos7/RPM-GPG-KEY-CentOS-7
yum erase -y NetworkManager NetworkManager-libnm kexec-tools firewalld-filesystem polkit
sed ‘s,^CRONDARGS=.*,&”-m off”,’ -i /etc/sysconfig/crond
sed ‘s,^\(OPTIONS=\).*,\1″-4″,’  -i /etc/sysconfig/chronyd
sed ‘s,^server .*,&\ncmdallow 127.0.0.1,’ -i /etc/chrony.conf
sed ‘s,^#\(terminfo xterm \x27is.*\),\1\nterm xterm,’ -i /etc/screenrc
cat >>/etc/sysconfig/network <<‘EOF’
IPV6INIT=”no”
NETWORKING=”yes”
NOZEROCONF=”yes”
EOF
echo -e “# ::1\t\tlocalhost localhost.localdomain localhost6 localhost6.localdomain6” >/etc/hosts
echo -e “127.0.0.1\tlocalhost localhost.localdomain localhost4 localhost4.localdomain4” >>/etc/hosts
echo -e ‘export TZ=’Asia/Shanghai’ PYTHONSTARTUP=”/usr/lib64/python2.7/pystartup.py” TMOUT=7200′ >/etc/profile.d/environ.sh
echo -e “blacklist acpi_pad\nblacklist power_meter” >/etc/modprobe.d/blacklist.conf
cat >/usr/lib64/python2.7/pystartup.py <<‘EOF’
#!/usr/bin/python
# -*- coding:utf_8 -*-
#from __future__ import print_function
from rlcompleter import readline
readline.parse_and_bind(“tab: Complete”)
EOF
cat >/etc/sysctl.d/70-system.conf <<‘EOF’
net.ipv4.ip_forward = 1
net.ipv4.ip_default_ttl = 255
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 0

net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
kernel.sysrq = 16
vm.swappiness = 0
EOF
# config vimrc
cat >>/etc/vimrc<<‘EOF’
set wrapscan
set noautoindent
set showmatch
set binary
set noswapfile
set ignorecase          ” Do case insensitive matching
set foldmethod=syntax
set foldlevel=100
filetype plugin off
EOF
sed -e ‘s,^#\(Port\).*,\1 10022,’ \
    -e ‘s,^#\(ListenAddress 0.0.0.0\),\1,’ \
    -e ‘s,^#\(PermitRootLogin\).*,\1 yes,’ \
    -e ‘s,^#\(MaxAuthTries\).*,\1 3,’ \
    -e ‘s,^#\(UseDNS\).*,\1 no,’ -i /etc/ssh/sshd_config
cat >/etc/sysconfig/network-scripts/ifcfg-eth0 <<‘EOF’
# Generated by dracut initrd
DEVICE=”eth0″
ONBOOT=”yes”
IPV6INIT=”no”
IPV4_FAILURE_FATAL=”no”
NM_CONTROLLED=”no”
TYPE=”Ethernet”
BOOTPROTO=”dhcp”
EOF

%end

subnet    192.168.1.0 netmask 255.255.255.0 {
    option routers 192.168.1.254;
    option subnet-mask 255.255.255.0;
    option domain-name-servers 192.168.1.254;
    option ntp-servers 192.168.1.254;
    filename “/gpxelinux.0”;
    next-server 192.168.1.254;
    pool {
        range dynamic-bootp 192.168.1.10 192.168.1.240;
        default-lease-time 3600;
        max-lease-time 72000;
        allow unknown-clients;
    }

}

#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#
ddns-update-style none;
ignore client-updates;
default-lease-time 14400;
max-lease-time 86400;
allow bootp;
allow booting;
local-address 192.168.1.254;
local-port 67;

include “/etc/dhcp/subnet-192.168”;

/usr/local/nginx/conf/nginx.conf
include        fastcgi.conf;
/usr/local/nginx/sbin/nginx
/usr/local/php/etc/php-fpm.d/www.conf
listen = 127.0.0.1:9000
systemctl start php-fpm.service
http://192.168.1.17/info.php
 
apachectl -t
systemctl start httpd
vim /etc/httpd/conf/httpd.conf
/var/www/html/info.php
apachectl start
詳細步驟,恢復步驟
1,備份xtrabackkup
2.新的伺服器上做slave,不設定read-only
業務低谷時期觀察直接伺服器上更新遠端伺服器
再停止mysql服務
修改配置檔案
[[email protected] html]# cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 172.40.1.10
 
 
今天主要實驗內容為壓力測試與架構分離調整
常用的優化手段有
    動靜分離
    讀寫分離
    管理分離
    nginx 增加狀態監測
    location /nginx-status {
         allow 192.168.0.0/16;
         deny all;
         stub_status on;
         access_log  off;
    }
 
    php-fpm 增加狀態監測
    php-fpm.d/www.conf
    pm.status_path = /php_status
 
    nginx.conf
    location ~ ^/(. \.php|php_status)$ {
        fastcgi_pass   unix:/var/run/php-fpm.sock
    fastcgi_index  index.php;
        include        fastcgi.conf;
    }
 
    apache bench 安裝與使用
    apache 自帶的壓力測試工具,簡單易用,大併發的時候需要自己查詢錯誤結果
    yum install httpd-tools
    ab [option] http://url
    支援 get post 自定義頭等
    -c 併發數量
    -n 請求總數
    -H 自定義請求頭
    -p post 檔案
 
    web bench 安裝與使用
    Webbench是一個在linux下使用的非常簡單的網站壓測工具。它使用fork()模擬多個客戶端同時訪問我們設定的URL,測試網站在壓力下工作的效能,最多可以模擬3萬個併發連線去測試網站的負載能力
    安裝依賴包:yum install ctags
    make
    使用
    ./webbench -r -t 60 -c 200 -2 http://url
    -r 傳送重新整理快取要求
    -t 測試時間
    -c 併發數量
    -2 使用 http1.1,長連線
    -h 幫助資訊
 
    wrk 壓力測試軟體
    優勢是支援執行緒,能更好的發揮多核的優勢
    安裝也很簡單,直接 make 即可
    -c  表示的是併發
    -d  測試持續的時間
    -t  來控制執行緒數(預設值為 2)
    /wrk -c 200 -d 10 -t 5 http://url
 
    php質數計算例子
    <?php
    $n = 0;
    $start = 1;
    $end = 50000;
    for($num = $start; $num <= $end; $num ) {
        if ( $num == 1 ) continue;
        for ($i = 2; $i <= sqrt($num); $i ) {
            if ($num % $i == 0) continue 2;
        }
        $n ;
    }
    print_R($n.”\n”);
    ?>
 
    netstat 與 ss
    tcp狀態統計
    ss -ant|awk ‘{A[$1] }END{for(a in A)print A[a],a}’
 
    資料庫建立 庫,表
    php 查詢資料庫壓力測試
    匯入 mydb.sql
    壓測 testmysql.php
 
 
    靜態頁面壓力測試
    t.html
 
    常用執行使用簡介:
    檢視一個程式執行的時間,總時間,核心態時間,使用者態時間
    time cmd
 
    檢視記憶體使用情況
    free
 
    檢視系統程序情況
    top & ps
    %CPU 上次更新到現在的CPU時間佔用百分比
    %MEM 程式執行佔用記憶體百分比
    virt 是虛擬記憶體
    res 是常駐記憶體
    shr 是共享記憶體
    程序狀態 R S D T Z X
    R  可執行狀態
    S  可中斷的睡眠狀態
    D  不可中斷狀態(怨婦)
    T  暫停或跟蹤
    t  跟蹤除錯狀態
    Z  退出態,沒有銷燬(殭屍,可使用 signal SIGCONT 找其 PPID 超度)
    X  退出態,被銷燬
     
    記憶體使用統計
    ps -eo cmd,%cpu|awk ‘{A[$1] =$NF}END{for(a in A)if(A[a])print a,A[a]|”column -t”}’
    tcp 連線狀態統計
    ss -ant|awk ‘{A[$1] }END{for(a in A)print a,A[a]}’
 
    tcp的三次握手四次斷開與狀態
    1. 客戶端獨有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2  (4)CLOSING (5)TIME_WAIT
    2. 伺服器獨有的:(1)LISTEN   (2)SYN_RCVD  (3)CLOSE_WAIT (4)LAST_ACK
    3. 共有的:      (1)CLOSED   (2)ESTABLISHED  
 
    LISTEN       – 偵聽來自遠方TCP埠的連線請求;    
    SYN-SENT     – 在傳送連線請求後等待匹配的連線請求;    
    SYN-RECEIVED – 在收到和傳送一個連線請求後等待對連線請求的確認;    
    ESTABLISHED  – 代表一個開啟的連線,資料可以傳送給使用者;    
    FIN-WAIT-1   – 等待遠端TCP的連線中斷請求,或先前的連線中斷請求的確認;   
    FIN-WAIT-2   – 從遠端TCP等待連線中斷請求;    
    CLOSE-WAIT   – 等待從本地使用者發來的連線中斷請求;    
    LAST-ACK     – 等待原來發向遠端TCP的連線中斷請求的確認;    
    TIME-WAIT    – 等待足夠的時間以確保遠端TCP接收到連線中斷請求的確認;    
    CLOSED       – 沒有任何連線狀態;
    CLOSING      – 同時發起關閉狀態,從 FIN-WAIT-1 –> CLOSING –> TIME-WAIT
 
    iostat 監控磁碟IO狀態
    yum install sysstat
 
    iptraf 軟體包簡單使用
 

    mysql 安裝到其他主機,在進行壓力測試對比

主1.15從1.14  1.13
昨天已經分離了 mysql,今天首先搭建 mysql 主從叢集
yum -y install perl-JSON  
yum -y install  mysql-community-*.rpm
systemctl start mysqld
systemctl enable mysqld
grep password /var/log/mysqld.log
mysql   -hlocalhost   -uroot   -p
 
vim /etc/my.cnf
systemctl restart mysqld
 
server_id=2
validate_password_policy=0
validate_password_length=6
log-bin=master2
binlog-format=”mixed”
 
set global validate_password_policy=0;
set global validate_password_length=6;
alter user [email protected]”localhost” identified by”123456″;
 
 
 
change  master  to
master_host=”192.168.1.15″,
master_user=”yaya”,
master_password=”123456″,
master_log_file=”master1.000001″,
master_log_pos=437;
start slave;
show slave status\G;
 
 
 
安裝 mariadb
yum install mariadb mariadb-server
 
配置 my.cnf,新增引數
bind-address    = 0.0.0.0
symbolic-links  = 0
server-id       = 10
log_bin         = mysql-bin
binlog-format   = statement
relay-log       = relay-log
read_only       = 1
relay_log_purge = 0
innodb_file_per_table
 
修改 server-id 引數,後啟動資料庫
id=$(ip -o a s dev eth0|grep -Po “(?<=inet 192.168.4.)\d “)
sed “s,^\(server-id\t= \).*,\1${id},” -i /etc/my.cnf
 
啟動服務
systemctl start mariadb
 
新增使用者,開啟主從同步
m01:
reset master;
create user ‘repl’@’%’ IDENTIFIED BY ‘lper’;
grant replication client,replication slave on *.* to [email protected]’%’;
 
node{1..3}
reset slave;
change master to master_host=’192.168.4.10′,master_user=’repl’,master_password=’lper’;
start slave;
 
# 在 master 上配置 root 登入許可權及密碼
drop database test;
use mysql;
truncate db;
delete from user where User=””;
delete from user where User=”root” limit 2;
update user set Host=”::1″ where User=”root” and Host=”%”;
update user set Host=”127.0.0.1″ where User=”root” and Host=”localhost”;
update user set password=password(‘toor’) where User=”root”;
flush privileges;
 
# 至此,mysql 主從已經建立完成
建立庫、表及測試資料
 
讀寫分離
實現讀寫分離方式:
    1、程式程式碼相容,對除 select 以外的操作在 master 上執行,select 在 slave 上執行
    2、中介軟體讀寫分離,對應用端透明
 
 
    mycat 讀寫分離和分散式架構中介軟體,Mycat 使用 java 開發,由於使用了JDK7的一些特性,所以必須 JDK7 或更高版本.
    安裝依賴包
    yum install java-1.8.0-openjdk
 
    配置一個使用者用來讀,一個使用者用來執行寫操作
    create user ‘read_user’@’%’ IDENTIFIED BY ‘user_read’;
    grant select on *.* to ‘read_user’@’%’;
 
    找一臺機器安裝 mycat 中介軟體,不建議複用
    mycat 解壓拷貝到 /usr/local/ 下
    修改配置檔案 schema.xml
<?xml version=”1.0″?>   
<!DOCTYPE mycat:schema SYSTEM “schema.dtd”>   
<mycat:schema xmlns:mycat=”http://io.mycat/”>   
   
    <schema name=”TESTDB” checkSQLschema=”false” sqlMaxLimit=”100″ dataNode=”dn1″>           
    </schema>   
    <dataNode name=”dn1″ dataHost=”localhost1″ database=”mydb” />   
    <dataHost name=”localhost1″ maxCon=”1000″ minCon=”10″ balance=”3″   
              writeType=”0″ dbType=”mysql” dbDriver=”native” switchType=”1″  slaveThreshold=”100″>   
        <heartbeat>select user()</heartbeat>   
        <!– can have multi write hosts –>   
        <writeHost host=”m01″ url=”192.168.4.10:3306″ user=”root” password=”toor”>   
            <!– can have multi read hosts –>   
            <readHost host=”node1″ url=”192.168.4.11:3306″ user=”read_user” password=”user_read” />   
            <readHost host=”node2″ url=”192.168.4.12:3306″ user=”read_user” password=”user_read” />   
            <readHost host=”node3″ url=”192.168.4.13:3306″ user=”read_user” password=”user_read” />   
        </writeHost>   
    </dataHost>   
       
</mycat:schema>
 
    配置檔案注意事項:
    conf/server.xml 可以不修改,但要注意  
    <property name=”schemas”>TESTDB</property>
    虛擬庫名稱,要和後面對應
    schemas是這個使用者下的邏輯資料庫可以有多個邏輯資料庫可以用“,”逗號隔開
    使用者名稱和密碼是連線 mycat 的使用者名稱和密碼,與 mysql 例項的使用者名稱密碼無關
    mycat預設的普通連線埠是8066,管理連線埠是9066
    schema:邏輯資料庫
    dataNode:節點
    dataHost:節點對應的讀庫寫庫的地址和連線
    balance指的負載均衡型別,目前的取值有4種:
    balance=”0″, 不開啟讀寫分離機制,所有讀操作都傳送到當前可用的writeHost上。
    balance=”1″,全部的readHost與stand by writeHost參與select語句的負載均衡
    balance=”2″,所有讀操作都隨機的在writeHost、readhost上分發。
    balance=”3″,所有讀請求隨機的分發到wiriterHost對應的readhost執行,writerHost不負擔讀壓力
 
    switchType指的是切換的模式,目前的取值也有4種:
    switchType=’-1′ 表示不自動切換
    switchType=’1′  預設值,表示自動切換
    switchType=’2′  基於MySQL主從同步的狀態決定是否切換,心跳語句為 show slave status
    switchType=’3′  基於MySQL galary cluster的切換機制(適合叢集)(1.4.1),心跳語句為 show status like ‘wsrep%’
     
    WriteType引數設定:
    writeType=“0”, 所有寫操作都傳送到可用的writeHost上。
    writeType=“1”,所有寫操作都隨機的傳送到readHost。
    writeType=“2”,所有寫操作都隨機的在writeHost、readhost分上發。
 
    配置完成以後連線 mycat 查詢
    mysql -uroot -p123456 -h192.168.4.20 -P 8066 -e ‘select @@hostname;’
    多查詢幾次,可以看到輪詢效果
 
    讀寫分離了,mycat 單點故障, mysql master 單點故障怎麼解決 ?
    官方推薦高可用方案
 
               ————-       ———–        ————————–
               | keepalived  |      |  —–   |       | ——–     ——– |    
               |———— |      |  |mycat|  |  ==>  | |mysql(M)|<==>|mysql(M)| |       
               |  ——-   |      |  —–   |       | ——–     ——– |    
               |  |haproxy|=>| ==>  |           |       |  MHA或其他多主高可用方案 |
               |  ——-   |      |  —–   |       |-~-~-~-~-~-~~~~-~-~-~-~-~-|           
client –> vip |    |高|     |      |  |mycat|  |  ==>  | ——–     ——– |
               |    |可|     |      |  —–   |       | |mysql(S)| 從 |mysql(S)| |
               |    |用|     |      |           |       | ——– 庫 ——– |  
               |  ——-   |      |  —–   |       | ——– 集 ——– |     
               |  |haproxy|=>| ==>  |  |mycat|  |  ==>  | |mysql(S)| 群 |mysql(S)| |   
               |  ——-   |      |  —–   |       | ——–     ——– |   
               ————-       ———–        ————————–
 
 
# 安裝 haproxy 和 keepalived
yum install haproxy keepalived
 
haproxy 配置
listen mysql_3306 *:3308
    mode   tcp
    option tcpka
    balance     leastconn
    server mycat_01 192.168.4.15:8066 check inter 3000 rise 1 maxconn 1000 fall 3
    server mycat_02 192.168.4.20:8066 check inter 3000 rise 1 maxconn 1000 fall 3
 
keepalived 配置,vip 配置
global_defs {
    router_id mycat
}
 
vrrp_instance Mycat {
    state BACKUP
    interface eth0
    track_interface {
        eth0
    }
    virtual_router_id 150
    priority 200
    nopreempt
    advert_int 5
    authentication {
        auth_type PASS
        auth_pass test_mycat
    }
    virtual_ipaddress {
        192.168.4.150/24   brd 192.168.4.255   dev eth0 label eth0:1
    }

}

NFS 搭建
nfs 用來解決資料共享問題,配置檔案 exports
/var/webroot    192.168.1.0/24(rw,all_squash,anonuid=1000,anongid=1000,async)
 
客戶機新增配置檔案 fstab
192.168.1.16:/var/webroot    /var/webroot    nfs     defaults,proto=tcp,nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=65536,wsize=65536    0 0
 
php session 共享 (redis)
1、redis 資料庫安裝
adduser -s /sbin/nologin -d /var/lib/redis redis
make MALLOC=libc
make PREFIX=/usr/local/redis install
mkdir -p /usr/local/redis/conf
cp redis.conf /usr/local/redis/conf/
 
修改配置檔案
bind 192.168.1.18
port 6379
dir /var/lib/redis
 
啟動指令碼 redis.service
[Unit]
Description=Redis In-Memory Data Store
After=network.target
 
[Service]
User=redis
Group=redis
Type=simple
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/conf/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli shutdown
Restart=always
RestartSec=42s
 
[Install]
WantedBy=multi-user.target
 
 
2、安裝 php redis 擴充套件
cd phpredis
git checkout 3.1.6
./configure –enable-redis –with-php-config=/usr/local/php/bin/php-config
make
cp .libs/redis.so  /usr/local/php/lib/php/extensions/
 
編輯 php.ini 載入配置
extension_dir = “/usr/local/php/lib/php/extensions”
extension=redis
 
驗證配置
php -m |grep redis
 
3、新增配置,讓 php session 使用 redis
修改 session.save_handler = files  為  session.save_handler = redis
修改 ;session.save_path = “/tmp”   為  session.save_path = “tcp://192.168.1.18:6379”
 
使用 php 指令碼測試
<?PHP
  echo “<pre>”;
  session_id(‘test-redis-session’);
  session_start();
  if(isset($_GET[“d”])) {
    foreach($_SESSION as $sid => $value){
        unset($_SESSION[$sid]);
    }
    session_destroy();
  }
  if(isset($_GET[“w”])) {
    $_SESSION[‘a’]=1;
    $_SESSION[‘b’]=2;
    $_SESSION[‘c’]=3;
  }
   
  print_R(session_id().”:\n”);
  print_R($_SESSION);
  echo “</pre>”.”\n”;
?>
 
redis 伺服器高可用
redis叢集實現大概有以下幾種方式:
 
1.redis-cluster,  官方提供的叢集搭建方案(過於重量級,比較適合後期資料量較大的時候的使用)
2.redis keepalive  虛擬IP,多臺配置非常複雜,不宜維護,需要 slaveof no one 指令碼
3.redis zookeeper  需要引入zookeeper,對現有程式碼變動較大
4.redis sentinel   redis自帶監控中介軟體
 
1、配置三臺 redis 伺服器
配置主從關係,在 slave 上新增配置
slaveof 192.168.1.18 6379
 
新增哨兵監控 sentinel.conf
修改配置檔案 sentinel.conf
bind 0.0.0.0
port 26379
protected-mode no
daemonize yes
sentinel monitor mymaster 192.168.1.18 6379 2
 
分別在主,從上啟動 sentinel
bin/redis-sentinel conf/sentinel.conf
 
連線 26379 校驗配置
檢視 master 資訊
redis-cli -h 192.168.1.18 -p 26379
INFO sentinel
 
也可以寫成系統服務
[Unit]
Description=Redis Monitor
After=redis.service
 
[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-sentinel /usr/local/redis/conf/sentinel.conf
ExecStop=/usr/local/redis/bin/redis-cli -p 26379 shutdown
Restart=always
RestartSec=42s
 
[Install]
WantedBy=multi-user.target
 
客戶端相容問題
客戶端程式(如PHP程式)連線redis時需要ip和port,但redis-server進行故障轉移時,主是變化的,所以ip地址也是變化的
客戶端程式如何感知當前主redis的ip地址和埠呢?
redis-sentinel提供了介面,請求任何一個sentinel,傳送SENTINEL get-master-addr-by-name <master name>就能得到當前主redis的ip和port。
 
解決方案1:  
    程式相容,優勢:擴充套件性好,運維成本低
              劣勢:開發成本高,連線變成 2 次
 
解決方案2:
    vip 漂移,優勢:程式端無感知,架構不需要改變
              劣勢:叢集龐大時配置管理複雜,運維成本高
 
方案2:
    增加配置切換指令碼 sentinel.conf
    sentinel client-reconfig-script mymaster /usr/local/redis/conf/reconfig.sh
 
reconfig.sh
#!/bin/bash
# args=(<master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>)
#         mymaster    leader  start   old.ip     old.port   new.ip  new.port
logger -p local0.info -t redis “${@:-NULL}”
vip=”192.168.1.100/32″
read oldip newip <<<“$4 $6”
if $(ip -o a s |grep -q ${oldip:-0.0.0.0});then
    /sbin/ifconfig eth0:1 down &>/dev/null
elif $(ip -o a s|grep -q ${newip:-0.0.0.0});then
   /sbin/ifconfig eth0:1 ${vip}
   /sbin/arping -q -c 3 -A ${vip%/*} -I eth0
fi