企業級集羣架構體系實戰(一)

企業級集羣架構體系實戰(一)



1、試驗拓撲圖

總體層次劃分拓撲簡圖

這裏寫圖片描述

2、試驗準備

  • 服務器主機準備

根據本試驗拓撲圖,預計需要12臺服務器主機

[web]
172.16.50.1 hostname=node1
172.16.50.2 hostname=node2
172.16.50.3 hostname=node3
172.16.50.4 hostname=node4
172.16.50.5 hostname=node5
172.16.50.6 hostname=node6
172.16.50.7 hostname=node7
172.16.50.8 hostname=node8
172.16.50.9 hostname=node9
172.16.50.10 hostname=node10
172.16.50.11 hostname=node11
172.16.50.12 hostname=node12
172.16.50.16 hostname=node16
172.16.50.17 hostname=node17

  • 關閉防火牆和SELinux
iptables -F
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
vim /etc/selinux/config
SELINUX=permissive
  • 同步時間
ntpdate 172.16.0.1
  • 修改/etc/hosts文件實現node1與node2之間可通過主機名互相通信

3、前端接入層調度器部署及高可用配置 [node1,node2]

見《企業級集羣架構體系實戰(二)》。

4、緩存層部署及動靜分離配置 [node3,node4]

見《企業級集羣架構體系實戰(二)》。

5、業務層動態資源服務器集羣部署 [node6,node7,node11,node12]

php資源服務器(提供wordpress站點服務)配置 [node6]

node6節點主機提供nginx和php-fpm服務,在php前端設置nginx的原因是:可以讓前端的緩存服務器集羣與本服務器間採用http協議通信,提高效率,方便管理。

  1. 安裝程序包
yum install nginx php php-fpm php-mbstrint php-mcrypt 
  1. 配置nginx服務
#修改配置文件
vim /etc/nginx/conf.d/proxy_php.conf
#修改配置如下
server {
    listen 80;
    server_name 192.168.50.6;

    location / {
        root  /data/web_resourse;
        index index.php index.html;
    }
    location ~* \.php$ {
        root /data/web_resourse;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/web_resourse$fastcgi_script_name;
        include fastcgi_params;
    }
    location ~* ^/(pm_status|ping)$ {
        include        fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param  SCRIPT_FILENAME  $fastcgi_script_name;
    }
}
  1. 配置php-fpm服務
vim /etc/php-fpm.d/www.conf
#修改如下幾項配置條目
listen = 0.0.0.0:9000
#此行使用 " ; " 註釋掉
;listen.allowed_clients = 127.0.0.1
user = nginx
group = nginx
pm.status_path = /pm_status
ping.path = /ping
  1. 動態資源準備
mkdir -pv /data/web_resourse;cd /data/web_resours
vim index.php
<?php
    phpinfo();
?>
#將wordpress-4.7.4-zh_CN.zip 程序包放至此目錄並解壓
unzip wordpress-4.7.4-zh_CN.zip
ln -sv wordpress wp
chown -R nginx.nginx wordpress
chown nginx.nginx wp
cd wordpress
  1. 在後端mysql數據庫中定義wordpress登錄mysql所需的用戶並授予權限

    • 在mysql主節點服務器上登錄後端數據庫
mysql -uroot -hlocalhost -p
  • 登錄後執行
CREATE DATABASE wpdb;
GRANT ALL ON wpdb.* TO 'wpuser'@'192.168.50.%' IDENTIFIED BY 'wppass';
FLUSH PRIVILEGES;

注意:此處也可以直接制定ProxySQL服務器從而調用後端的具有讀寫分離功能的主從複製集羣,需要在wordpress中填寫另一個登錄賬戶信息

具體見mysql集羣中的讀寫分離配置

  • 在ProxySQL主機上登錄mysql集羣(Proxysql主機的IP地址爲192.168.50.17)
mysql -umyadmin -pmypass -h192.168.50.17
  • 登錄後執行
CREATE DATABASE wpdb;
  1. 啓動所有服務

配置Tomcat動態資源服務

tomcat動態資源服務器集羣成員的IP地址及角色分配:

node7   172.16.50.7     192.168.50.7    nginx(director)     前端調度器
node11  172.16.50.11    192.168.50.11   tomcat/memcached    動態資源服務器以及session server
node11  172.16.50.12    192.168.50.12   tomcat/memcached    動態資源服務器以及session server
  1. 安裝程序包及其他準備工作

    • 同步時間,關閉防火牆和selinux

    • node7

yum install nginx
  • node11和node12

安裝程序包

#安裝jdk和tomcat相關程序包
yum install -y java-1.8.0-openjdk tomcat tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp 
#安裝memcached程序包
yum install -y memcached

設置java環境變量

vim /etc/profile.d/java.sh
export JAVA_HOME=/usr
#加載該配置文件
source /etc/profile.d/java.sh
  • 備份所有程序的原始配置文件

    1. 配置兩臺tomcat動態資源服務器
  • 準備動態資源,定義test應用

#創建資源目錄結構
mkdir /usr/share/tomcat/webapps/test/{WEB-INF,META-INF,lib,classes}
#創建 .jsp 文件
vim /usr/share/tomcat/webapps/test/index.jsp
#正文如下
<%@ page language="java" %>
<%@ page import="java.util.*" %>
<html>
    <head><title>TomcatA</title></head>
    <body>
        <h1><font color="red">TomcatA.achudk.com</font></h1>
        <table align="centre" border="1">
            <tr>
                <td>Session ID</td>
            <% session.setAttribute("achudk.com","achudk.com"); %>
            <td><%= session.getId() %></td>
            </tr>
            <tr>
                <td>Created on</td>
                <td><%= session.getCreationTime() %></td>
            </tr>
        </table>
        <br>
            <% out.println("hello tc1");
            %>
    </body>
</html>
#另一臺tomcat服務器的index.jsp文件中將 "tomcatA" 替換爲 "tomcatB" 、將 "hello tc1" 替換爲 "hello tc2" 。
  • 修改配置文件
vim /etc/tomcat/server.xml
#在文件尾部的<Host>配置段後面重新定義一個<Host>配置段,如下:
<Host name="localhost"  appBase="webapps"
      unpackWARs="true" autoDeploy="true">

    <Context path="/test" docBase="test" reloadable="true">
#<Manager>配置段作用爲:配置memcached提供session server功能,若不開啓此功能可刪除此段配置
        <Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager"
            memcachedNodes="n1:172.16.50.11:11211,n2:172.16.50.12:11211"
            failoverNodes="n2"
            requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"
            transcoderFactoryClass="de.javakaffee.web.msm.serializer.javolution.JavolutionTranscoderFactory"
        />
    </Context>

    <!--
    <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
    -->

    <!-- Access log processes all example.
         Documentation at: /docs/config/valve.html
         Note: The pattern used is equivalent to using pattern="common" -->
    <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
           prefix="localhost_access_log." suffix=".txt"
           pattern="%h %l %u %t &quot;%r&quot; %s %b" />
</Host>
  • 啓用tomcat默認頁的manager和host-manager管理功能,修改管理功能的用戶配置文件
vim /etc/tomcat/tomcat-user.xml
#增加以下三項
<role rolename="admin-gui"/>
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui,manager-gui"/>
  1. 配置前端nginx調度器

    • 在nginx節點主機執行:
vim /etc/nginx/conf.d/proxy_tomcat.conf
#內容如下
upstream tcsrvs {
        server 172.16.50.11:8080;
        server 172.16.50.12:8080;
}

server {
        listen 80;
        server_name 172.16.50.7;

        location / {
                proxy_pass http://tcsrvs;
        }
}
  • 啓動tomcat服務,測試兩臺服務器的test應用是否正常工作

6、會話服務器集羣部署及主備冗餘配置 [node11,node12]

session server服務器集羣成員的IP地址及角色分配:

node11  172.16.50.11    192.168.50.11   memcached    session server
node11  172.16.50.12    192.168.50.12   memcached    session server
  1. 安裝程序包及其他準備工作

    • 同步時間,關閉防火牆和selinux

    • node11和node12

安裝程序包

#安裝memcached程序包
yum install -y memcached
  1. 準備工作

    • 獲取以下5個 .jar文件
javolution-5.4.3.1.jar
memcached-session-manager-2.1.1.jar
memcached-session-manager-tc7-2.1.1.jar
msm-javolution-serializer-2.1.1.jar
spymemcached-2.11.1.jar
  1. 使用memcached配置兩臺服務器成爲具有冗餘能力的session server

    • 將以下 .jar 類文件放置於指定位置
mv javolution-5.4.3.1.jar\
memcached-session-manager-2.1.1.jar\
memcached-session-manager-tc7-2.1.1.jar\
msm-javolution-serializer-2.1.1.jar\
spymemcached-2.11.1.jar\ 
/usr/share/java/tomcat/
  • 啓動memcached服務,並重啓tomcat服務

    1. 測試功能
  • 測試tomcat默認頁面及管理頁面,訪問站點:

http://172.16.50.7/test

訪問http://172.16.50.7:8080/test/,結果爲

#
Tomcat Server A
Session ID  67FB8590C1DC933795BF7FD999CF106E-n1
Created on  1500705152610
hello tc1

#
Tomcat Server B
Session ID  67FB8590C1DC933795BF7FD999CF106E-n1
Created on  1500705152610
hello tc2
  • 驗證結果:調度到兩臺tomcat服務器,會話ID一致。

7、結構化數據庫(MySQL)集羣配置部署及主從半同步複製、讀寫分離、Master高可用配置 [node17,node9,192.node10,node16]

創建主從複製集羣

  1. 在主節點node9
vim /etc/my.cnf.d/server.cnf 

[mysqld]
innodb_file_per_table=ON
skip_name_resolve=ON

server_id=1
log_bin=master-log
relay_log=relay-log
sync_binlog=1
  1. 在從節點node10和node16設置
vim /etc/my.cnf.d/server.cnf

[mysqld]
innodb_file_per_table=ON
skip_name_resolve=ON

server_id=2
relay_log=relay-log
log_bin=master-log
relay_log_purge=0
read-only=1
sync_master_info=1
sync_relay_log_info=1
  1. 啓動主從節點的mariadb服務
systemctl start mariadb
  1. 登錄主節點的mysql客戶端,執行:
GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO 'repluser'@'192.168.50.%' IDENTIFIED BY 'replpass';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'repluser'@'192.168.50.%';
SHOW MASTER STATUS;
  1. 分別登錄每個從節點的mysql客戶端,分別執行:
CHANGE MASTER TO MASTER_HOST='192.168.50.9',MASTER_USER='repluser',MASTER_PASSWORD='replpass',MASTER_PORT=3306,MASTER_LOG_FILE='master-log.000003',MASTER_LOG_POS=498;
SHOW SLAVE STATUS\G;
START SLAVE;

實現主從複製架構的半同步複製

  1. 分別在主從節點上執行執行安裝插件命令
#在主節點服務器上登錄mysql客戶端,執行:
INSTALL PLUGIN rpl_semi_sync_master SONAME 'semisync_master.so';
#在從節點服務器上登錄mysql客戶端,執行:
INSTALL PLUGIN rpl_semi_sync_slave SONAME 'semisync_slave.so';
#查看插件的加載狀態
SHOW PLUGINS;
  1. 啓用插件

    • 主節點
#查看插件運行狀態
SHOW GLOBAL VARIABLES LIKE '%semi_sync%';
#啓用插件
SET @@global.rpl_semi_sync_master_enabled=ON;
  • 從節點
#查看插件運行狀態
SHOW GLOBAL VARIABLES LIKE '%semi%';
#啓用插件
SET @@global.rpl_semi_sync_slave_enabled=ON;
  1. 在從節點重啓IO線程
STOP SLAVE IO_THREAD;
START SLAVE IO_THREAD;

實現主從複製架構的讀寫分離

  1. 安裝proxysql程序
yum install ./proxysql-1.3.6-1-centos7.x86_64.rpm
  1. 修改配置文件
cp /etc/proxysql.cnf{,.bak}
vim /etc/proxysql.cnf

#file proxysql.cfg
datadir="/var/lib/proxysql"

admin_variables=
{
        admin_credentials="admin:admin"
        mysql_ifaces="127.0.0.1:6032;/tmp/proxysql_admin.sock"
#       refresh_interval=2000
#       debug=true
}

#修改mysql_variables配置段
mysql_variables=
{
        threads=4
        max_connections=2048
        default_query_delay=0
        default_query_timeout=36000000
        have_compress=true
        poll_timeout=2000
        interfaces="0.0.0.0:3306;/tmp/proxysql.sock"
        default_schema="mydb"
        stacksize=1048576
        server_version="5.5.30"
        connect_timeout_server=3000
        monitor_history=600000
        monitor_connect_interval=60000
        monitor_ping_interval=10000
        monitor_read_only_interval=1500
        monitor_read_only_timeout=500
        ping_interval_server=120000
        ping_timeout_server=500
        commands_stats=true
        sessions_sort=true
        connect_retries_on_failure=10
}
#修改mysql_servers配置段
mysql_servers =
(
    {
        address = "192.168.50.9"
        port = 3306
        hostgroup = 0
        status = "ONLINE"
        weight = 1
        compression = 0
        max_replication_lag = 200
    },
    {
        address = "192.168.50.10"
        port = 3306
        hostgroup = 1
        status = "ONLINE"
        weight = 1
        compression = 0
        max_replication_lag = 500
    },
    {
        address = "192.168.50.16"
        port = 3306
        hostgroup = 1
        status = "ONLINE"
        weight = 1
        compression = 0
        max_replication_lag = 500
    }
)
#修改mysql_user配置段
mysql_users:
(
    {
        username = "myadmin"
        password = "mypass"
        default_hostgroup = 0
        active = 1
        default_schema="mydb"
    }
)
#定義讀寫分離配置段
mysql_replication_hostgroups=
(
    {
        writer_hostgroup=0
        reader_hostgroup=1
        comment="test repl 1"
    }
)
  1. 在node9(MySQL主節點)服務器上爲ProxySQL代理節點建立用戶並授權

注意:修改主節點數據庫中的數據,從節點會自動同步修改數據

CREATE DATABASE mydb;
GRANT ALL ON *.* TO 'myadmin'@'192.168.50.%' IDENTIFIED BY'mypass';
FLUSH PRIVILEGES;
  1. 在node17啓動proxysql服務並連接本地mysql服務
#啓動proxysql服務
service proxysql start
ss -tnl
#使用預先建立的賬號密碼登錄node9服務器
mysql -umyadmin -pmypass -h192.168.50.17
#登錄成功後會顯示下面提示信息
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.30 (ProxySQL)
  1. 讀寫分離操作至此已經完成

實現Master節點的高可用——MHA

  1. 創建ssh密鑰,使任意兩臺主機間能夠通過ssh自由通信

此處爲了操作簡單,可以使所有主機的密鑰相同,具體做法爲:在任意一臺主機上生成一對密鑰,將密鑰發送至所有主機的對應目錄下。

#假如在node9節點主機上執行
ssh-keygen -t rsa -P ''
ssh-copy-id -i id_rsa.pub root@192.168.50.9
#測試ssh連接可用性並更新know_hosts文件內容
ssh root@192.168.50.9 'ip a'
ssh root@192.168.50.10 'ip a'
ssh root@192.168.50.16 'ip a'
ssh root@192.168.50.17 'ip a'
#
scp -p id_rsa authorized_keys id_rsa.pub known_hosts root@192.168.50.10:/root/.ssh/
scp -p id_rsa authorized_keys id_rsa.pub known_hosts root@192.168.50.16:/root/.ssh/
scp -p id_rsa authorized_keys id_rsa.pub known_hosts root@192.168.50.17:/root/.ssh/
  1. 獲取mha4mysql-manager和mha4mysql-node兩個程序包並安裝

    • 在manager主機上需要同時安裝manager和node包
yum install ./mha4mysql-manager-0.56-0.el6.noarch.rpm ./mha4mysql-node-0.56-0.el6.noarch.rpm
  • 在node主機上僅需安裝mha4mysql-node包
yum install ./mha4mysql-node-0.56-0.el6.noarch.rpm
  1. 初始化MHA

此處僅設置一個備用master節點

#創建目錄
mkdir /etc/masterha
#創建、修改並增加配置文件內容
vim /etc/masterha/app1.cnf
[server default]
user=mhaadmin
password=mhapass
manager_workdir=/data/masterha/app1
manager_log=/data/masterha/app1/manager.log
remote_workdir=/data/masterha/app1
ssh_user=root
repl_user=repladmin
repl_password=replpass
ping_interval=1

[server1]
hostname=192.168.50.9
candidate_master=1

[server2]
hostname=192.168.50.10
candidate_master=1

[server3]
hostname=192.168.50.16
#設置爲0,表示不作爲主節點的備用節點
candidate_master=0
  1. 在node9主節點服務器上爲mha創建並授權用戶
GRANT ALL ON *.* TO 'mhaadmin'@'192.168.50.%' IDENTIFIED BY 'mhapass';
GRANT ALL ON *.* TO 'repladmin'@'192.168.50.%' IDENTIFIED BY 'replpass';
FLUSH PRIVILEGES;

注意:此處需要在所有從節點上登錄mysql客戶端並執行 ” FLUSH PRIVILEGES; ” 命令,刷新授權。

  1. 在MAH manager主機上驗證各主機是否可以基於ssh實現自由通信
masterha_check_ssh --conf=/etc/masterha/app1.cnf
#成功信息
[info] All SSH connection tests passed successfully
  1. 在MAH manager主機上對各mysql主機進行健康狀態監測
masterha_check_repl --conf=/etc/masterha/app1.cnf
#成功信息
MySQL Replication Health is OK.
  1. 在MAH manager主機上啓動進程
nohup masterha_manager --conf=/etc/masterha/app1.cnf &>> /data/masterha/app1/manager.log &
  1. 在MAH manager主機上監測狀態
masterha_check_status --conf=/etc/masterha/app1.cnf 
#顯示結果
app1 (pid:4663) is running(0:PING_OK), master:192.168.50.9
  1. 停止MHA的方法:
masterha_stop --conf=/etc/masterha/app1.cnf
發佈了56 篇原創文章 · 獲贊 33 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章