乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      mycat詳解

       丹楓無(wú)跡 2022-05-22 發(fā)布于北京

      本文目錄:

      1.安裝mycat

      2.mycat全局表

      3.mycat讀寫(xiě)分離

      4.mycat分片規(guī)則

      5.E-R表

      6.HAProxy

      7.mycat負(fù)載均衡集群

      8.Keepalived

      1.安裝mycat

      1.解壓
        tar -zxvf Mycat-server-1.6.7.3-release-20190828135747-linux.tar.gz 
      2. 為了更好的看目錄結(jié)構(gòu),安裝tree
        yum -y install tree
        # 查詢mycat的目錄結(jié)構(gòu),我的mycat是安裝在study下的
        tree /study/mycat  
      3. 設(shè)置MYCAT_HOME的變量(如果沒(méi)有安裝jdk,還需要安裝jdk):
        vi /etc/profile
        
       export CLASSPATH=.:${JAVA_HOME}/jre/lib/rt.jar:${JAVA_HOME}/lib/dt.jar:${JAVA_HOME}/lib/tools.jar
       export PATH=$PATH:${JAVA_HOME}/bin
       export MYCAT_HOME=/study/mycat
      4.刷新使變量生效:
         source /etc/profile
      5.設(shè)置 wrapper.java.command 的java 路徑(mycat的conf目錄下):
         vi wrapper.conf
         wrapper.java.command=%JAVA_HOME%/bin/java 
      6.修改server.xml(開(kāi)啟實(shí)時(shí)統(tǒng)計(jì),便于后期安裝mycat-eye的監(jiān)測(cè)):
          <!-- 1為開(kāi)啟實(shí)時(shí)統(tǒng)計(jì)、0為關(guān)閉 -->
          <property name="useSqlStat">1</property>
      7.修改schema.xml:
      
      <?xml version="1.0"?>
      <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
      <!--schema表示當(dāng)前mycat維護(hù)的一個(gè)邏輯庫(kù)相關(guān)配置,邏輯庫(kù)中可以包含多個(gè)邏輯庫(kù)-->
      <mycat:schema xmlns:mycat="http://cat/">
          <!--邏輯庫(kù):客戶端連接mycat,可以看到的所有庫(kù)并不是真實(shí)的數(shù)據(jù)庫(kù)資源而是mycat經(jīng)過(guò)資源整合之后
      	允許客戶端查看到的schema邏輯庫(kù),用戶是否有權(quán)限查看到邏輯庫(kù),取決于server.xml中的配置的用戶屬性schemas,
      	對(duì)應(yīng)的就是這個(gè)schema標(biāo)簽的name-->
      	<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100">
      		<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
      		<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
      		<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
      		<table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"
      			   rule="mod-long" />
      		<table name="employee" primaryKey="ID" dataNode="dn1,dn2"
      			   rule="sharding-by-intfile" />
      		<table name="customer" primaryKey="ID" dataNode="dn1,dn2"
      			   rule="sharding-by-intfile">
      			<childTable name="orders" primaryKey="ID" joinKey="customer_id"
      						parentKey="id">
      				<childTable name="order_items" joinKey="order_id"
      							parentKey="id" />
      			</childTable>
      			<childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
      						parentKey="id" />
      		</table>
      		<!--測(cè)試配置一個(gè)邏輯表-->
      		<table name="test_table" primaryKey="id" dataNode="dn1"></table>
      	</schema>
      
      	<!--配置mycat的分片節(jié)點(diǎn)-->
      	<dataNode name="dn1" dataHost="localhost1" database="test" />
      	<dataNode name="dn2" dataHost="localhost1" database="test_mycat" />
      	<dataNode name="dn3" dataHost="localhost1" database="test" />
      	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
      			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
      		<heartbeat>select user()</heartbeat>
      		<!-- can have multi write hosts,這里的密碼對(duì)應(yīng)數(shù)據(jù)庫(kù)的密碼 -->
      		<writeHost host="hostM1" url="localhost:3306" user="root" password="****">
      			<!-- can have multi read hosts -->
      			<readHost host="hostS2" url="localhost:3306" user="root" password="****" />
      		</writeHost>
      	</dataHost>
      </mycat:schema>
      
      7.配置完成后,可以運(yùn)行./mycat console 查詢配置是否出錯(cuò)(mycat的bin目錄下)
      8.啟動(dòng)mycat:
         ./mycat start
      9.啟動(dòng)mysql,下面的-h后面的ip替換成自己的,密碼是在server.xml里面配置的root的密碼:   
         mysql -uroot -p -P8066 -h192.168.189.150 -DTESTDB --default_auth=mysql_native_password
      

      測(cè)試

      我這里使用的test_table表,在mycat里面插入一條數(shù)據(jù):

      然后使用navicat打開(kāi)我的數(shù)據(jù)庫(kù),可以看到剛剛insert的數(shù)據(jù)已經(jīng)插入進(jìn)去了:

      2.mycat全局表

      1.全局表的概念

      在項(xiàng)目中,總會(huì)一部分字典項(xiàng)等數(shù)據(jù),這種數(shù)據(jù)一般數(shù)據(jù)量不會(huì)很大,而且改動(dòng)也比較少。在mycat中將這種表稱之為全局表,通常這種表可以不需要進(jìn)行拆分,每個(gè)分片都創(chuàng)建一張相同的表,在所有的分片上都保存一份數(shù)據(jù)。在進(jìn)行插入、更新、刪除的時(shí)候,會(huì)將sql語(yǔ)句發(fā)送到所有的分片上執(zhí)行,在進(jìn)行查詢時(shí),也會(huì)把sql發(fā)送到各個(gè)分片上。這樣避免了跨庫(kù)的關(guān)聯(lián)操作,直接與本分片上的全局表進(jìn)行聚合操作。

      2.全局表的特征

      1. 插入、更新操作會(huì)實(shí)時(shí)在所有的節(jié)點(diǎn)上執(zhí)行,保持各分片的數(shù)據(jù)一致性
      2. 查詢時(shí),只從一個(gè)節(jié)點(diǎn)獲取
      3. 可以跟任何一個(gè)表進(jìn)行jion操作

      3.全局表測(cè)試

      1.打開(kāi)數(shù)據(jù)庫(kù)主從并在主庫(kù)中創(chuàng)建數(shù)據(jù)庫(kù)/表

      create database test_global01;
      use test_global01;
      CREATE TABLE `order_status` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`status_name` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
      create database test_global02;
      use test_global02;
      CREATE TABLE `order_status` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`status_name` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
      create database test_global03;
      use test_global03;
      CREATE TABLE `order_status` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`status_name` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
      

      2.配置schema.xml,配置上一步創(chuàng)建的表

      ? 在schema.xml里配置一個(gè)表,和真實(shí)數(shù)據(jù)庫(kù)表要對(duì)應(yīng),要將三個(gè)分片都包含進(jìn)去。 type="global"這個(gè)表示全局表,必填。注意分片節(jié)點(diǎn)最好設(shè)置不一樣,如果分片節(jié)點(diǎn)設(shè)置相同的,可能會(huì)出現(xiàn)在mycat上插入了一次,但在sql上卻執(zhí)行了幾次的情況,即在數(shù)據(jù)庫(kù)中多條記錄。

      <table name="order_status" dataNode="dn$1-3" primaryKey="id" type="global"></table>
      <!--配置mycat的分片節(jié)點(diǎn)-->
      <dataNode name="dn1" dataHost="localhost1" database="test_global01" />
      <dataNode name="dn2" dataHost="localhost1" database="test_global02" />
      <dataNode name="dn3" dataHost="localhost1" database="test_global03" />
      

      3.將schema.xml并上傳到服務(wù)器中,并查看沒(méi)有問(wèn)題

      4.啟動(dòng)mycat并插入測(cè)試數(shù)據(jù)

      insert into order_status(status_name) values ('ORDER_NOT_PAY');
      insert into order_status(status_name) values ('ORDER_PAY');
      insert into order_status(status_name) values ('ORDER_FINISH');
      

      使用explain查看mycat的插入可以看到,對(duì)三個(gè)分片都進(jìn)行了執(zhí)行

      mysql> explain insert into order_status(status_name) values ('ORDER_PAY');
      +-----------+------------------------------------------------------------+
      | DATA_NODE | SQL                                                        |
      +-----------+------------------------------------------------------------+
      | dn1       | insert into order_status(status_name) values ('ORDER_PAY') |
      | dn2       | insert into order_status(status_name) values ('ORDER_PAY') |
      | dn3       | insert into order_status(status_name) values ('ORDER_PAY') |
      +-----------+------------------------------------------------------------+
      3 rows in set (0.00 sec)
      

      在從庫(kù)的mysql上查看test_gloabl02的數(shù)據(jù):

      mysql> use test_global02;
      Reading table information for completion of table and column names
      You can turn off this feature to get a quicker startup with -A
      
      Database changed
      mysql> select * from order_status;
      +----+---------------+
      | id | status_name   |
      +----+---------------+
      |  1 | ORDER_NOT_PAY |
      |  2 | ORDER_PAY     |
      |  3 | ORDER_FINISH  |
      +----+---------------+
      3 rows in set (0.00 sec)
      

      執(zhí)行查詢可以看出,查詢時(shí)在隨機(jī)節(jié)點(diǎn)上執(zhí)行,插入,更新時(shí)會(huì)把sql語(yǔ)句發(fā)送到所有分片節(jié)點(diǎn)上執(zhí)行。

      mysql> explain select * from order_status;
      +-----------+--------------------------------------+
      | DATA_NODE | SQL                                  |
      +-----------+--------------------------------------+
      | dn2       | SELECT * FROM order_status LIMIT 100 |
      +-----------+--------------------------------------+
      1 row in set (0.00 sec)
      
      mysql> explain select * from order_status;
      +-----------+--------------------------------------+
      | DATA_NODE | SQL                                  |
      +-----------+--------------------------------------+
      | dn3       | SELECT * FROM order_status LIMIT 100 |
      +-----------+--------------------------------------+
      1 row in set (0.00 sec)
      
      mysql> explain select * from order_status;
      +-----------+--------------------------------------+
      | DATA_NODE | SQL                                  |
      +-----------+--------------------------------------+
      | dn1       | SELECT * FROM order_status LIMIT 100 |
      +-----------+--------------------------------------+
      1 row in set (0.01 sec)
      

      3.mycat讀寫(xiě)分離

      1.writeType標(biāo)簽:有兩個(gè)值(0/1),取值決定于 寫(xiě)/讀寫(xiě) 的邏輯

      ? 0:表示當(dāng)前dataHost接受到分片的讀寫(xiě)操作中,寫(xiě)操作,只在第一個(gè)writeHost;

      ? 1:表示隨機(jī)的讀寫(xiě)所有的writeHost和readHost中實(shí)現(xiàn),覆蓋balance的邏輯

      2.balance標(biāo)簽:控制一個(gè)dataHost中所有的邏輯,一旦writeType=1,就無(wú)效了。

      ? 0:不開(kāi)啟讀寫(xiě)分離,直在第一個(gè)writeHost執(zhí)行,其他的readHost,writeHost都不進(jìn)行讀的操作

      ? 1:除了第一個(gè)writeHost以外的所有writeHost和readHost進(jìn)行隨機(jī)讀取,在高并發(fā)時(shí),如果其他節(jié)點(diǎn)都高負(fù)荷的運(yùn)轉(zhuǎn)進(jìn)行讀操作,也有一部分的讀被分配到第一個(gè)writeHost上

      ? 2:隨機(jī)的在所有節(jié)點(diǎn)進(jìn)行讀取

      ? 3:到所有的readHost當(dāng)中讀取數(shù)據(jù),如果分片中不存在readHost,只會(huì)到第一個(gè)writeHost上讀取

      讀寫(xiě)分離的測(cè)試,還是在schema.xml里配置,下面是筆者的配置(150是主庫(kù),151、152是從庫(kù)):

      <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,這里的密碼對(duì)應(yīng)數(shù)據(jù)庫(kù)的密碼 -->
      		<writeHost host="hostM1" url="192.168.189.150:3306" user="root" password="zj005200..">
      			<readHost host="hostS2" url="192.168.189.151:3306" user="root" password="zj005200.." />
      			<readHost host="hostS3" url="192.168.189.152:3306" user="root" password="zj005200.." />
      		</writeHost>
      	</dataHost>
      

      執(zhí)行可以看到,查詢是隨機(jī)在兩臺(tái)從庫(kù)上執(zhí)行:

      mysql> show variables like 'server_id';
      +---------------+-------+
      | Variable_name | Value |
      +---------------+-------+
      | server_id     | 2     |
      +---------------+-------+
      1 row in set (0.01 sec)
      
      mysql> show variables like 'server_id';
      +---------------+-------+
      | Variable_name | Value |
      +---------------+-------+
      | server_id     | 3     |
      +---------------+-------+
      1 row in set (0.01 sec)
      

      4.mycat分片規(guī)則

      ? rule屬性:對(duì)于一個(gè)指定了分片的表格,可以配置rule屬性,根據(jù)名稱定義分片的計(jì)算規(guī)則。

      如:schema.xml文件里配置的:

      <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
      

      在rule.xml文件中的:

      <tableRule name="auto-sharding-long">
      	<rule>
      		<columns>id</columns>//當(dāng)前的算法使用的字段名稱,如果是不同的,可以在標(biāo)簽中修改
      		<algorithm>rang-long</algorithm>//算法名稱,rang-long指向了函數(shù)function標(biāo)簽
      	</rule>
      </tableRule>
      <function name="rang-long" class="cat.route.function.AutoPartitionByLong">//class代表執(zhí)行代碼類(lèi)
          <property name="mapFile">autopartition-long.txt</property>//計(jì)算輔助文件,在conf下有這個(gè)文件
      </function>
      

      下面是文件的內(nèi)容:

      # range start-end ,data node index
      # K=1000,M=10000.
      0-500M=0   --表示如果數(shù)據(jù)在0~500萬(wàn)之間,會(huì)插入到第一個(gè)分片中(含頭不含尾)
      500M-1000M=1 --表示如果數(shù)據(jù)在500~1000萬(wàn)之間,會(huì)插入到第二個(gè)分片中(含頭不含尾)
      1000M-1500M=2
      

      自定義分片規(guī)則(以城市分片):

      schema.xml添加表:
      <!--測(cè)試分片規(guī)則的表-->
      <table name="t_city" dataNode="dn$1-3" rule="sharding-by-intfile-test"/>
      rule.xml自定義tableRule:
      <!--自定義分片規(guī)則-->
      <tableRule name="sharding-by-intfile-test">
      	<rule>
      		<columns>city</columns>
      		<algorithm>hash-int-test</algorithm>
      	</rule>
      </tableRule>
      <function name="hash-int-test" class="cat.route.function.PartitionByFileMap">
          <property name="mapFile">partition-hash-int-test.txt</property>
          <!--0:integer  非0表示string-->
          <property name="type">1</property>
          <!--設(shè)置默認(rèn)節(jié)點(diǎn),默認(rèn)節(jié)點(diǎn)的作用:枚舉分片時(shí),如果碰到不識(shí)別的枚舉值,就讓他進(jìn)入默認(rèn)節(jié)點(diǎn),不配置可能會(huì)報(bào)錯(cuò),小于 0 表示不設(shè)置默認(rèn)節(jié)點(diǎn),大于等于 0 設(shè)置默認(rèn)節(jié)點(diǎn)-->
          <property name="defaultNode">0</property>
      </function>
      
      添加一個(gè)partition-hash-int-test.txt:
      hubei=0
      guangdong=1
      chongqing=2
      DEFAULT_NODE=0
      

      在mysql中創(chuàng)建表:

      use test_global01;
      CREATE TABLE `t_city` (`id` varchar(20) NOT NULL,`city` varchar(20) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
      use test_global02;
      CREATE TABLE `t_city` (`id` varchar(20) NOT NULL,`city` varchar(20) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
      use test_global03;
      CREATE TABLE `t_city` (`id` varchar(20) NOT NULL,`city` varchar(20) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
      

      啟動(dòng)mycat,并插入數(shù)據(jù):

      mysql> insert into t_city(id,city) values (database(),'hubei');
      Query OK, 1 row affected (0.03 sec)
      
      mysql> insert into t_city(id,city) values (database(),'guangdong');
      Query OK, 1 row affected (0.02 sec)
      
      mysql> insert into t_city(id,city) values (database(),'chongqing');
      Query OK, 1 row affected (0.01 sec)
      
      mysql> insert into t_city(id,city) values (database(),'hainan');
      Query OK, 1 row affected (0.01 sec)
      mysql> select * from t_city;
      +---------------+-----------+
      | id            | city      |
      +---------------+-----------+
      | test_global01 | hubei     |
      | test_global02 | guangdong |
      | test_global03 | chongqing |
      | test_global01 | hainan    |
      +---------------+-----------+
      4 rows in set (0.00 sec)
      

      如圖所示:上面的插入,將hubei插入第一個(gè)分片,guangdong插入第二個(gè)分片,chongqing插入第三個(gè)分片,同時(shí),hainan則插入到默認(rèn)節(jié)點(diǎn)里。

      5.E-R表

      由于mycat底層不支持跨分片操作,如果需求中有多個(gè)相關(guān)的分片表進(jìn)行關(guān)聯(lián)操作時(shí),就需要如E-R分片的配置邏輯。 基于E-R關(guān)系進(jìn)行分片,子表的記錄與其父表的記錄保存在同一個(gè)分片上,這樣關(guān)聯(lián)就不需要跨庫(kù)進(jìn)行查詢了。

      1.E-R表配置

      在schema.xml配置文件中schema標(biāo)簽中配置customer table 的分庫(kù)策略

      <!-- ER表配置示例-->
       <table name="customer" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile">
         <childTable name="orders" primaryKey="ID" joinKey="customer_id" parentKey="id">
           <childTable name="order_items" joinKey="order_id" parentKey="id" /> 
         </childTable>
         <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id" parentKey="id" />
       </table>
      <!--如果需要配置多個(gè)分片,則需要修改rule.xml中,設(shè)置count 多少個(gè)分片
      <function name="hash-int" class="cat.route.function.PartitionByFileMap">
      	<property name="mapFile">partition-hash-int.txt</property>
          <property name="count">3</property>
      </function>-->
      

      配置說(shuō)明: table標(biāo)簽表明這是配置表信息; name = "customer" 說(shuō)明這張表的名稱叫customer, id 是 主鍵, 表分布在dn1,dn2,dn3這三個(gè)數(shù)據(jù)庫(kù)中, 表的分片策略是sharding-by-intfile.

        childTable表明子表信息, 此示例中說(shuō)明customer關(guān)聯(lián)了兩張子表,分別是orders,customer_addr;我們以orders表為例說(shuō)明.

        orders表的主鍵是id,它通過(guò)joinKey關(guān)聯(lián)父表的parentKey.本例中orders表就是以customer_id去關(guān)聯(lián)customer表的id.也就是說(shuō),當(dāng)customer表中id = 1 在dn1時(shí),那么orders表中customer_id = 1這條數(shù)據(jù)也會(huì)在dn1這個(gè)數(shù)據(jù)庫(kù). 這樣設(shè)置就避免了跨庫(kù)join,提高了查詢效率.

        同樣的,order_items表關(guān)聯(lián)的父表是orders. 原理一樣.

      2.E-R表插入數(shù)據(jù)

      # 啟動(dòng)后,創(chuàng)建表
      create table customer(id int not null primary key,name varchar(100),company_id int not null,sharding_id int not null);
      create table orders (id int not null primary key ,customer_id int not null,sataus int ,note varchar(100) );
      create table order_items (id int not null primary key ,order_id int not null,remark varchar(100) );
      
      # 插入數(shù)據(jù)
      insert into customer (id,name,company_id,sharding_id )values(1,'wang',1,10000);  
      insert into customer (id,name,company_id,sharding_id )values(2,'xue',2,10010);
      insert into customer (id,name,company_id,sharding_id )values(3,'feng',3,10000);
      insert into customer (id,name,company_id,sharding_id )values(4,'test',4,10010);
      insert into customer (id,name,company_id,sharding_id )values(5,'admin',5,10010);
      
      insert into orders(id,customer_id) values(1,1);
      insert into orders(id,customer_id) values(2,2);
      insert into orders(id,customer_id,sataus,note) values(3,4,2,'xxxx');
      insert into orders(id,customer_id,sataus,note) values(4,5,2,'xxxx');
      
      insert into order_items(id,order_id,remark) VALUES (1,1,'1mark');
      insert into order_items(id,order_id,remark) VALUES (2,2,'2mark');
      insert into order_items(id,order_id,remark) VALUES (3,3,'3mark');
      insert into order_items(id,order_id,remark) VALUES (4,4,'4mark');
      

      3.E-R表測(cè)試

      如下圖所示:使用navicat查詢, 基于E-R關(guān)系進(jìn)行分片,子表的記錄與其父表的記錄保存在同一個(gè)分片上,這樣關(guān)聯(lián)就不需要跨庫(kù)進(jìn)行查詢了。

      6.HAProxy

      筆者使用的環(huán)境:

      服務(wù)器名稱 ip 操作系統(tǒng) 安裝軟件
      mysql-master 192.168.189.150 CentOS7.1 mysql.mycat,keepalived
      mysql-slave1 192.168.189.151 CentOS7.1 mysql.mycat,haproxy,keepalived
      mysql-slave2 192.168.189.152 CentOS7.1 mysql.mycat,keepalived

      1.HAProxy介紹

      1. HAProxy 是一款提供高可用性、負(fù)載均衡以及基于TCP和HTTP應(yīng)用的代理軟件,支持虛擬主機(jī),它是免費(fèi)、快速并且可靠的一種解決方案。
      2. HAProxy 實(shí)現(xiàn)了一種事件驅(qū)動(dòng)、單一進(jìn)程模型,此模型支持非常大的并發(fā)連接數(shù)。
      3. HAProxy支持連接拒絕 : 因?yàn)榫S護(hù)一個(gè)連接的打開(kāi)的開(kāi)銷(xiāo)是很低的,有時(shí)我們很需要限制攻擊爬蟲(chóng),也就是說(shuō)限制它們的連接打開(kāi)從而限制它們的危害。
      4. HAProxy 支持全透明代理:可以用客戶端IP地址或者任何其他地址來(lái)連接后端服務(wù)器。這個(gè)特性僅在Linux 2.4/2.6內(nèi)核打了cttproxy補(bǔ)丁后才可以使用.

      2. HAProxy特性

      1. 可靠性與穩(wěn)定性都非常出色,可與硬件級(jí)設(shè)備媲美
      2. 支持連接拒絕,可以用于防止DoS攻擊
      3. 支持長(zhǎng)連接、短連接和日志功能,可根據(jù)需要靈活配置
      4. 路由 HTTP 請(qǐng)求到后端服務(wù)器,基于cookie作會(huì)話綁定;同時(shí)支持通過(guò)獲取指定的 url 來(lái)檢測(cè)后端服務(wù)器的狀態(tài)
      5. HAProxy 還擁有功能強(qiáng)大的 ACL 支持,可靈活配置路由功能,實(shí)現(xiàn)動(dòng)靜分離,在架構(gòu)設(shè)計(jì)與實(shí)現(xiàn)上帶來(lái)很大方便
      6. 可支持四層和七層負(fù)載均衡,幾乎能為所有服務(wù)常見(jiàn)的提供負(fù)載均衡功能
      7. 擁有功能強(qiáng)大的后端服務(wù)器的狀態(tài)監(jiān)控 web 頁(yè)面,可以實(shí)時(shí)了解設(shè)備的運(yùn)行狀態(tài) ,還可實(shí)現(xiàn)設(shè)備上下線等簡(jiǎn)單操作。
      8. 支持多種負(fù)載均衡調(diào)度算法,并且也支持 session 保持。
      9. Haproxy 七層負(fù)載均衡模式下,負(fù)載均衡與客戶端及后端的服務(wù)器會(huì)分別建立一次TCP連接,而在四層負(fù)載均衡模式下(DR),僅建立一次 TCP 連接;七層負(fù)載均衡對(duì)負(fù)載均衡設(shè)備的要求更高,處理能力也低于四層負(fù)載均衡

      3.HAProxy安裝

      ? HAProxy的安裝非常簡(jiǎn)單:yum install -y haproxy

      ? 查看安裝的haproxy: rpm -qi haproxy

      ? 安裝完成后的目錄:cd /usr/sbin

      ? 配置文件的目錄:cd /etc/haproxy/

      4.HAProxy配置文件

      ? 1.HAProxy的配置文件由兩部分構(gòu)成:

      ? 全局設(shè)定(global settings):主要用于定義HAProxy進(jìn)程管理安全及性能相關(guān)的參數(shù)

      ? 對(duì)代理的設(shè)定(proxies):共分為4段(defaults,frontend,backend,listen)

      ? defaults:為除了global以外的其他配置段提供默認(rèn)參數(shù),默認(rèn)配置參數(shù)可由下一個(gè)defaults重新設(shè)定
      frontend:定義一系列監(jiān)聽(tīng)的套接字,這些套接字可接受客戶端請(qǐng)求并與之建立連接
      backend:定義“后端”服務(wù)器,前端代理服務(wù)器將會(huì)把客戶端的請(qǐng)求調(diào)度至這些服務(wù)器
      listen:定義監(jiān)聽(tīng)的套接字和后端的服務(wù)器,類(lèi)似于將frontend和backend段放在一起,通常只對(duì)TCP流量有用, 所有代理的名稱只能使用大寫(xiě)字母、小寫(xiě)字母、數(shù)字、-(中線)、_(下劃線)、.(點(diǎn)號(hào))、:(冒號(hào)),并且ACL區(qū)分字母大小寫(xiě)

      配置haproxy配置文件,目錄:/etc/haproxy/haproxy.cfg

      這里筆者把自己已經(jīng)配置好的的配置文件貼出來(lái):

      global
          log         127.0.0.1 local2
      
          chroot      /var/lib/haproxy
          pidfile     /var/run/haproxy.pid
          maxconn     4000
          user        haproxy
          group       haproxy
          daemon
      
          # turn on stats unix socket
          stats socket /var/lib/haproxy/stats
      
      #---------------------------------------------------------------------
      # common defaults that all the 'listen' and 'backend' sections will
      # use if not designated in their block
      #---------------------------------------------------------------------
      defaults
          mode                    tcp
          log                     global
          option                  tcplog
          option                  dontlognull
          option http-server-close
         #option forwardfor       except 127.0.0.0/8
          option                  redispatch
          retries                 3
          timeout http-request    10s
          timeout queue           1m
          timeout connect         10s
          timeout client          1m
          timeout server          1m
          timeout http-keep-alive 10s
          timeout check           10s
          maxconn                 3000
      
      #---------------------------------------------------------------------
      # main frontend which proxys to the backends
      #---------------------------------------------------------------------
      frontend  mycat
          bind 0.0.0.0:8066
      	mode tcp
      	log  global
      	default_backend mycat_server
      
      #---------------------------------------------------------------------
      # static backend for serving up images, stylesheets and such
      #---------------------------------------------------------------------
      backend mycat_server
          balance roundrobin
      	server mycat1 192.168.189.151:8066 check inter 5s rise 2 fall 3
      	server mycat2 192.168.189.152:8066 check inter 5s rise 2 fall 3
      
      #---------------------------------------------------------------------
      # round robin balancing between the various backends
      #---------------------------------------------------------------------
      listen stats
           mode http  
      	bind 0.0.0.0:1080 
      	stats enable   
      	stats hide-version 
      	stats uri /Haproxyadmin?stats 
      	stats realm Haproxy\ Statistics
      	stats auth admin:admin
      	stats admin if TRUE
      

      在這里解釋一下三個(gè)配置:

       #option forwardfor       except 127.0.0.0/8   --如果后端服務(wù)器需要獲取真實(shí)ip,就需要配置的參數(shù)
       balance roundrobin   --負(fù)載方式:輪詢
       server mycat1 192.168.189.151:8066(mycat的ip和端口) check inter 5s(檢測(cè)心跳時(shí)間) rise 2(2次正確表示服務(wù)器可用) fall 3(3次失敗表示服務(wù)器不可用)
      

      5.啟動(dòng)haproxy負(fù)載均衡器

      /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg 
      

      查看進(jìn)程,如果看到如下則提示配置成功:

      [root@localhost haproxy]# ps -ef|grep haproxy
      haproxy    7512      1  0 09:02 ?        00:00:00 /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg
      root       7516   7393  0 09:02 pts/0    00:00:00 grep --color=auto haproxy
      

      關(guān)閉防火墻:

      systemctl stop firewalld
      

      在瀏覽器上訪問(wèn)(連接地址:http://192.168.189.151:1080/Haproxyadmin?stats 賬號(hào)/密碼:上面listen中配置的admin/admin),如果看到如下頁(yè)面,就表示已經(jīng)成功:

      7.mycat負(fù)載均衡集群

      1.靜態(tài)負(fù)載均衡算法包括:輪詢,比率,優(yōu)先權(quán)

      ? 輪詢:順序循環(huán)將請(qǐng)求依次順序循環(huán)地連接每個(gè)服務(wù)器。當(dāng)其中某個(gè)服務(wù)器發(fā)生第二到第7層的故障,BIG-IP就把其從順序循環(huán)隊(duì)列中拿出,不參加下一次的輪詢,直到其恢復(fù)正常。
      ? 比率:給每個(gè)服務(wù)器分配一個(gè)加權(quán)值為比例,根椐這個(gè)比例,把用戶的請(qǐng)求分配到每個(gè)服務(wù)器。當(dāng)其中某個(gè)服務(wù)器發(fā)生第二到第7層的故障,BIG-IP 就把其從服務(wù)器隊(duì)列中拿出,不參加下一次的用戶請(qǐng)求的分配, 直到其恢復(fù)正常。
      ? 優(yōu)先權(quán):給所有服務(wù)器分組,給每個(gè)組定義優(yōu)先權(quán),BIG-IP 用戶的請(qǐng)求,分配給優(yōu)先級(jí)最高的服務(wù)器組;當(dāng)最高優(yōu)先級(jí)中所有服務(wù)器出現(xiàn)故障,BIG-IP 才將請(qǐng)求送給次優(yōu)先級(jí)的服務(wù)器組。這種方式,實(shí)際為用戶提供一種熱備份的方式。

      2.負(fù)載均衡的優(yōu)勢(shì)

      ? (1)高性能:負(fù)載均衡技術(shù)將業(yè)務(wù)較均衡的分擔(dān)到多臺(tái)設(shè)備或鏈路上,從而提高了整個(gè)系統(tǒng)的性能;
      ? (2)可擴(kuò)展性:負(fù)載均衡技術(shù)可以方便的增加集群中設(shè)備或鏈路的數(shù)量,在不降低業(yè)務(wù)質(zhì)量的前提下滿足不斷增長(zhǎng)的業(yè)務(wù)需求;
      ? (3)高可靠性:?jiǎn)蝹€(gè)甚至多個(gè)設(shè)備或鏈路出現(xiàn)故障也不會(huì)導(dǎo)致業(yè)務(wù)中斷,提高了整個(gè)系統(tǒng)的可靠性;
      ? (4)可管理性:大量的管理共組都集中在使用負(fù)載均衡技術(shù)的設(shè)備上,設(shè)備集群或鏈路集群只需要維護(hù)通過(guò)的配置即可;
      ? (5)透明性:對(duì)用戶而言,集群等于一個(gè)或多個(gè)高可靠性、高性能的設(shè)備或鏈路,用戶感知不到,也不關(guān)心具體的網(wǎng)絡(luò)結(jié)構(gòu),增加或減少設(shè)備或鏈路數(shù)量都不會(huì)影響正常的業(yè)務(wù)。

      8.keepalived

      1.keepalived概念

      ? keepalived,保持存活,就是高可用設(shè)備或熱備用來(lái)防止單點(diǎn)故障的發(fā)生,keepalived通過(guò)請(qǐng)求一個(gè)vip來(lái)達(dá)到請(qǐng)求真實(shí)ipi地址的功能,而vip能夠在一臺(tái)機(jī)器發(fā)生故障的時(shí)候,自動(dòng)漂移到另外一臺(tái)機(jī)器上,從來(lái)達(dá)到了高可用HAProxy的功能。

      2.keepalived的功能

      • 通過(guò)ip漂移
      • 對(duì)HAProxy應(yīng)用層的應(yīng)用服務(wù)器集群進(jìn)行狀態(tài)監(jiān)控

      3.keepalived原理

      ? keepalived的實(shí)現(xiàn)基于VRRP實(shí)現(xiàn)的保證集群高可用的一個(gè)服務(wù)軟件,主要功能是實(shí)現(xiàn)真機(jī)的故障隔離和負(fù)載均衡器間的失敗切換,防止單點(diǎn)故障。

      VRRP協(xié)議:Virtual Route Redundancy Protocol虛擬路由冗余協(xié)議。是一種容錯(cuò)協(xié)議,保證當(dāng)主機(jī)的下一跳路由出現(xiàn)故障時(shí),由另一臺(tái)路由器來(lái)代替出現(xiàn)故障的路由器進(jìn)行工作,從而保持網(wǎng)絡(luò)通信的連續(xù)性和可靠性。在介紹VRRP之前先介紹一些關(guān)于VRRP的相關(guān)術(shù)語(yǔ):

      虛擬路由器:由一個(gè) Master 路由器和多個(gè) Backup 路由器組成。主機(jī)將虛擬路由器當(dāng)作默認(rèn)網(wǎng)關(guān)。

      VRID:虛擬路由器的標(biāo)識(shí)。有相同 VRID 的一組路由器構(gòu)成一個(gè)虛擬路由器。

      Master 路由器:虛擬路由器中承擔(dān)報(bào)文轉(zhuǎn)發(fā)任務(wù)的路由器。

      Backup 路由器: Master 路由器出現(xiàn)故障時(shí),能夠代替 Master 路由器工作的路由器。

      虛擬 IP 地址:虛擬路由器的 IP 地址。一個(gè)虛擬路由器可以擁有一個(gè)或多個(gè)IP 地址。

      IP 地址擁有者:接口 IP 地址與虛擬 IP 地址相同的路由器被稱為 IP 地址擁有者。

      虛擬 MAC 地址:一個(gè)虛擬路由器擁有一個(gè)虛擬 MAC 地址。虛擬 MAC 地址的格式為 00-00-5E-00-01-{VRID}。通常情況下,虛擬路由器回應(yīng) ARP 請(qǐng)求使用的是虛擬 MAC 地址,只有虛擬路由器做特殊配置的時(shí)候,才回應(yīng)接口的真實(shí) MAC 地址。

      優(yōu)先級(jí): VRRP 根據(jù)優(yōu)先級(jí)來(lái)確定虛擬路由器中每臺(tái)路由器的地位。

      非搶占方式:如果 Backup 路由器工作在非搶占方式下,則只要 Master 路由器沒(méi)有出現(xiàn)故障,Backup 路由器即使隨后被配置了更高的優(yōu)先級(jí)也不會(huì)成為Master 路由器。

      搶占方式:如果 Backup 路由器工作在搶占方式下,當(dāng)它收到 VRRP 報(bào)文后,會(huì)將自己的優(yōu)先級(jí)與通告報(bào)文中的優(yōu)先級(jí)進(jìn)行比較。如果自己的優(yōu)先級(jí)比當(dāng)前的 Master 路由器的優(yōu)先級(jí)高,就會(huì)主動(dòng)搶占成為 Master 路由器;否則,將保持 Backup 狀態(tài)。

      4.keepalived組件

      keepalived是模塊化設(shè)計(jì),不同模塊負(fù)責(zé)不同的功能,core模塊為keepalived的核心,負(fù)責(zé)主進(jìn)程的啟動(dòng)、維護(hù)以及全局配置文件的加載和解析。checkers負(fù)責(zé)健康檢查,包括常見(jiàn)的各種檢查方式。VRRP模塊是來(lái)實(shí)現(xiàn)VRRP協(xié)議的。

      5.keepalived配置

      1.解壓并安裝(安裝keepalived 需要用到 openssl):

      cd /home
      # 安裝環(huán)境依賴
      yum install gcc gcc-c++ openssl openssl-devel
      # 如果沒(méi)有安裝過(guò)wget, yum install wget 安裝
      wget -q https://www./software/keepalived-1.2.18.tar.gz
      # ls查看是否安裝了 keepalived-1.2.18.tar.gz
      tar -zxvf keepalived-1.2.18.tar.gz
      cd keepalived-1.2.18
      # 監(jiān)測(cè)
      ./configure --prefix=/usr/local/keepalived-1.2.18/
      # 編譯安裝
      make && make install
      

      2.將keepalived安裝成Linux服務(wù)

      # 因?yàn)闆](méi)有使用keepalived的默認(rèn)路徑安裝(默認(rèn)是/usr/local),安裝后,需要復(fù)制默認(rèn)配置文件到默認(rèn)路徑下
      mkdir /etc/keepalived
      cp /usr/local/keepalived-1.2.18/etc/keepalived/keepalived.conf /etc/keepalived/
      # 將初始化文件復(fù)制到etc里
      cp /usr/local/keepalived-1.2.18/etc/rc.d/init.d/keepalived /etc/init.d
      # 將配置文件復(fù)制到etc里
      cp /usr/local/keepalived-1.2.18/etc/sysconfig/keepalived /etc/sysconfig
      # 軟連接
      ln -s /usr/local/keepalived-1.2.18/sbin/keepalived /usr/sbin/
      # 將keepalived設(shè)置為開(kāi)機(jī)啟動(dòng)
      chkconfig keepalived on
      

      3.keepalived配置文件

      cd /etc/keepalived/
      # 修改配置文件,建議下載下來(lái)修改
      vi keepalived.conf
      
      # 下面是主keepalived.conf的配置文件
      ! Configuration File for keepalived
      
      global_defs {  # 全局配置標(biāo)識(shí),表明這個(gè)區(qū)域是全局配置
         router_id LVS_MASTER
      }
      
      vrrp_sync_group VG1 {
      	group {
      		VI_1
      	}
      }
      # keepalived會(huì)去檢測(cè)負(fù)載均衡器,所以要設(shè)定一個(gè)腳本,讓他自己去檢測(cè)
      vrrp_script chk_haproxy {
          # 檢測(cè)haproxy狀態(tài)的腳本路徑
          script "/etc/keepalived/haproxy_check.sh"  
          # 檢測(cè)間隔時(shí)間
          interval 2 
          # 如果條件成立,權(quán)重+2,反之 -2
          weight 2 
      }
      # 定義一種虛擬路由協(xié)議,即vrrp,一個(gè)vrrp_instance 定義一個(gè)虛擬路由器,VI_1實(shí)例名
      vrrp_instance VI_1 {
          # 定義初始狀態(tài),樂(lè)意是master或者backup(備份)
          state MASTER
          # 工作接口,通告選舉使用哪個(gè)接口進(jìn)行,使用ip addr查看
          interface ens33
          # 虛擬路由id,如果是一組,則定義一個(gè)id,如果是多組,則定義多個(gè)
          virtual_router_id 51
          # 優(yōu)先級(jí)策略選擇參數(shù)
          priority 100
          # 通告頻率單位是s
          advert_int 1
          # 通信認(rèn)證機(jī)制
          authentication {
              auth_type PASS
              auth_pass 1111
          }
          # 虛擬路由ip網(wǎng)段不一樣,設(shè)置自己的網(wǎng)段+ip
          virtual_ipaddress {
              192.168.189.100  
          }
      
            # 檢測(cè)腳本 對(duì)應(yīng)的是vrrp_script chk_haproxy 負(fù)載均衡器
          track_script{
      	chk_haproxy
          }
      
      
      }
      
      # 從keepalived.conf的配置文件:
      global_defs {
        #備用
         router_id LVS_BACKUP
      }
      
      vrrp_sync_group VG1 {
      	group {
      		VI_1
      	}
      }
      
      vrrp_script chk_haproxy {
      script "/etc/keepalived/haproxy_check.sh" 
      interval 2 
      weight 2 
      }
      
      vrrp_instance VI_1 {
         # 狀態(tài)為備用的狀態(tài) 
          state BACKUP
          interface ens33
          virtual_router_id 51
          # 優(yōu)先級(jí)不能高于主
          priority 90
          advert_int 1
          authentication {
              auth_type PASS
              auth_pass 1111
          }
          virtual_ipaddress {
              192.168.189.100
          }
      
            track_script{
      	chk_haproxy
            }
      }
      
      
      

      4.keepalived檢測(cè)腳本

      #!/bin/bash   
      		START_HAPROXY="/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg" LOG_FILE="/usr/local/keepalived/log/haproxy-check.log" # 日志文件,會(huì)新建一個(gè)日志文件
      		HAPS=`ps -C haproxy --no-header |wc -l`  # 檢測(cè)狀態(tài),0表示未啟動(dòng),1表示啟動(dòng)
              date "+%Y-%m-%d %H:%M:%S" >> $LOG_FILE   # 記錄時(shí)間
      		echo "check haproxy status" >> $LOG_FILE   # 記錄狀態(tài)
      		if [ $HAPS -eq 0 ];then   
      		echo $START_HAPROXY >> $LOG_FILE  # 記錄啟動(dòng)命令
      		/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg #啟動(dòng)haproxy 
      		sleep 3 #啟動(dòng)之后進(jìn)行睡眠,3s后再進(jìn)行判斷是否已經(jīng)成功啟動(dòng),如果沒(méi)有啟動(dòng)就把keepalived服務(wù)關(guān)掉,換成備份的服務(wù)
      		if [ `ps -C haproxy --no-header |wc -l` -eq 0 ];then 
      		echo "start haproxy failed, killall keepalived" >> $LOG_FILE 
      		killall keepalived 
      		service keepalived stop 
      		fi
      		fi
      

      5.給腳本賦值權(quán)限

      chmod +x /etc/keepalived/haproxy_check.sh
      # 創(chuàng)建日志目錄
      mkdir /usr/local/keepalived/log
      

      6.keepalived相關(guān)程序:

      service keepalived start # 啟動(dòng)
      service keepalived stop  # 停止
      service keepalived restart # 重啟
      service keepalived status	# 查看keepalived狀態(tài)
      

      7.演示ip漂移

      # 在從1上啟動(dòng)haproxy
      [root@localhost keepalived]# /usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg 
      # 啟動(dòng)keepalived服務(wù)
      [root@localhost keepalived]# service keepalived start
      # ip addr 查看ip可以看到主keepalived的虛擬ip已經(jīng)生效了
      

      # 關(guān)閉主虛擬機(jī)上的keepalived,可以看到在主虛擬機(jī)上的虛擬ip已經(jīng)沒(méi)有了,同時(shí)在虛擬ip已經(jīng)飄到152這臺(tái)虛擬機(jī)上了
      [root@localhost keepalived]# service keepalived stop
      # 開(kāi)啟主虛擬機(jī)上的keepalived,ip將重新回到主虛擬機(jī)上
      

      8.演示Keepalived 重新啟動(dòng)haproxy

      關(guān)閉haproxy,可以看到,keepalived把haproxy重啟了。

      卸載keepalived和haproxy

      卸載haproxy
      yum remove haproxy
      
      # 通過(guò)yum安裝的
      yum remove keepalived
      
      # 通過(guò)源碼包安裝的
      [root@localhost keepalived]# cd /home/keepalived-1.2.18
      [root@localhost keepalived-1.2.18]# make uninstall 
      [root@localhost keepalived-1.2.18]# cd ../
      [root@localhost home]# rm -rf keepalived-1.2.18
      [root@localhost home]# rm -rf keepalived-1.2.18.tar.gz 
      [root@localhost home]# cd /etc
      [root@localhost etc]# rm -rf keepalived
      [root@localhost etc]# cd /usr/local
      [root@localhost local]# rm -rf keepalived
      [root@localhost local]# rm -rf keepalived-1.2.18/
      
      # 驗(yàn)證
      [root@localhost etc]# serive keepalived satrt
      -bash: serive: 未找到命令
      [root@localhost etc]# systemctl start keepalived
      Job for keepalived.service failed because the control process exited with error code. See "systemctl status keepalived.service" and "journalctl -xe" for details.
      
      

      參考文章:

      https://www.cnblogs.com/z-qinfeng/p/9726707.html

      https://blog.csdn.net/bbwangj/article/details/82763431

      https://blog.csdn.net/l1028386804/article/details/76397064

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類(lèi)似文章 更多