數(shù)據(jù)庫架構(gòu)之【MySQL8+MyCat2+Keepalived】RDBMS 讀寫分離和分庫分表集群方案

MyCat 是一款開源(遵循 Apache License 2.0 協(xié)議)的大數(shù)據(jù)庫集群中間件,用于搭建 MySQL 數(shù)據(jù)庫的分布式集群驯杜,實(shí)現(xiàn)分庫分表功能,解決數(shù)據(jù)庫中海量數(shù)據(jù)存儲和查詢性能的問題。MyCat 還是一個 MySQL 數(shù)據(jù)庫的集群中間件,主要實(shí)現(xiàn) RDBMS 數(shù)據(jù)庫集群的故障轉(zhuǎn)移姻报、負(fù)載均衡、讀寫分離等功能间螟。MyCat 2.0 使用了全新架構(gòu)吴旋。

Keepalived 是一款基于 VRRP 協(xié)議的輕量級服務(wù)高可用和負(fù)載均衡方案,提供避免服務(wù)器單點(diǎn)故障和請求分流的能力寒亥。

本方案基于CentOS8系統(tǒng)設(shè)計邮府,建議在RedHat/CentOS系統(tǒng)中使用荧关。部署數(shù)據(jù)庫集群使用服務(wù)器及網(wǎng)絡(luò)資源較多溉奕,建議在實(shí)施前做好規(guī)劃工作,有利于部署工作順利忍啤、有序進(jìn)行加勤。

目錄

1.前言

2.集群部署拓?fù)鋱D

3.MySQL8 + Replication 主備庫部署方案

4.MyCat 集群中間件的安裝和配置

5.Keepalived 高可用中間件的安裝和配置

6.MyCat 監(jiān)控中間件的安裝和配置


1.前言

1、分庫分表

MyCat 的關(guān)鍵技術(shù)是分庫分表同波,它通過將 MySQL 數(shù)據(jù)庫中物理表中的數(shù)據(jù)切分成多個表分片鳄梅,并將表分片存儲在多個數(shù)據(jù)庫節(jié)點(diǎn)上,從而構(gòu)建分布式存儲架構(gòu)未檩,提升巨表關(guān)聯(lián)戴尸、排序、分組聚合等 OLAP 的能力冤狡。

分庫分表的工作原理:攔截客戶端提交的SQL語句并進(jìn)行分析(如:分片分析孙蒙、路由分析项棠、讀寫分離分析、緩存分析等)挎峦,然后將此SQL發(fā)往后端的真實(shí)數(shù)據(jù)庫香追,并將返回的結(jié)果處理(如:數(shù)據(jù)合并)后再返回給客戶端。如下圖:


單個規(guī)則匹配
多個規(guī)則匹配

2坦胶、讀寫分離集群

MyCat 還是一個位于 MySQL 數(shù)據(jù)庫和客戶端之間透典,主要實(shí)現(xiàn)讀寫分離功能的集群中間件。主要解決在業(yè)務(wù)系統(tǒng)存在大量的讀并發(fā)時顿苇,通過負(fù)載均衡提高查詢請求吞吐量峭咒,并將多個數(shù)據(jù)庫節(jié)點(diǎn)集群化管理,在多主集群中單點(diǎn)數(shù)據(jù)庫故障時候選主節(jié)點(diǎn)切換纪岁。

MySQL 數(shù)據(jù)庫集群

3讹语、運(yùn)維監(jiān)控

MyCat 提供運(yùn)維監(jiān)控系統(tǒng),能夠?qū)崿F(xiàn)對 MyCat 的 JVM蜂科、線程顽决、后端 RDBMS 數(shù)據(jù)庫、服務(wù)器(CPU导匣、內(nèi)存才菠、磁盤、網(wǎng)絡(luò))的監(jiān)控服務(wù)贡定。

運(yùn)維監(jiān)控

4赋访、應(yīng)用場景

1)適用于 MySQL 數(shù)據(jù)庫集群的讀寫分離、候選主節(jié)點(diǎn)切換缓待、負(fù)載均衡等高可用模式蚓耽;

2)適用于 MySQL 數(shù)據(jù)庫集群的分表分庫,對于單表數(shù)據(jù)超過1000 萬的物理表進(jìn)行分片旋炒,最大支持1000億數(shù)據(jù)的單表分片步悠;

3)適用于多租戶應(yīng)用,通過分庫分表實(shí)現(xiàn)應(yīng)用數(shù)據(jù)按照租戶劃分物理數(shù)據(jù)庫存儲瘫镇。從租戶的角度來看鼎兽,個人應(yīng)用的數(shù)據(jù)集約存儲在獨(dú)立的空間,從應(yīng)用角度看铣除,分布式數(shù)據(jù)庫有利于海量數(shù)據(jù)的分析和查詢谚咬;

4)適用于海量數(shù)據(jù)的統(tǒng)計、分析尚粘、研判等 OLAP 能力的支撐數(shù)據(jù)庫择卦,分庫分表能夠快速完成巨表關(guān)聯(lián)、排序、分組聚合等數(shù)據(jù)計算功能秉继;

5) 適用于海量數(shù)據(jù)的實(shí)時查詢潘明,如:百億數(shù)據(jù)頻繁查詢的記錄需要在3秒內(nèi)反饋結(jié)果,包括主鍵查詢秕噪、范圍查詢或其他屬性查詢的情況钳降;

6)不適用物理表無法分片、分布式事務(wù)強(qiáng)一致性腌巾、分布式數(shù)據(jù) JOIN 查詢的應(yīng)用場景遂填。

5、關(guān)鍵特性

  • 支持 SQL92 標(biāo)準(zhǔn)澈蝙;
  • 支持 MySQL吓坚、Oracle、DB2灯荧、SQL Server礁击、PostgreSQL 等 DB 的常見 SQL 語法;
  • 遵守 MySQL 原生協(xié)議逗载,跨語言哆窿,跨平臺,跨數(shù)據(jù)庫的通用中間件代理厉斟;
  • 基于心跳的自動故障切換挚躯,支持讀寫分離,支持 MySQL 主從庫擦秽,以及 Galera Cluster 集群码荔;
  • 支持 Galera for MySQL 集群,Percona Cluster 或者 MariaDB cluster感挥;
  • 基于 Nio 實(shí)現(xiàn)缩搅,有效管理線程,解決高并發(fā)問題触幼;
  • 支持?jǐn)?shù)據(jù)的多片自動路由與聚合硼瓣,支持 sum、count域蜗、max 等常用的聚合函數(shù),支持跨庫分頁巨双;
  • 支持單庫內(nèi)部任意 JOIN噪猾,支持跨庫2表 JOIN霉祸,甚至基于 Caltlet 的多表 JOIN;
  • 支持通過全局表袱蜡,ER 關(guān)系的分片策略丝蹭,實(shí)現(xiàn)了高效的多表 JOIN 查詢;
  • 支持多租戶方案坪蚁;
  • 支持 XA 分布式事務(wù)(1.6.5)奔穿;
  • 支持全局序列號镜沽,解決分布式下的主鍵生成問題;
  • 分片規(guī)則豐富贱田,插件化開發(fā)缅茉,易于擴(kuò)展;
  • 強(qiáng)大的 Web 監(jiān)控系統(tǒng)男摧,命令行監(jiān)控蔬墩;
  • 支持前端作為 MySQL 通用代理,后端 JDBC 方式支持 Oracle耗拓、DB2拇颅、SQL Server 、 MongoDB 乔询、巨杉樟插;
  • 支持密碼加密;
  • 支持服務(wù)降級竿刁;
  • 支持 IP 白名單黄锤;
  • 支持 SQL 黑名單、SQL 注入攻擊攔截食拜;
  • 支持 Prepare 預(yù)編譯指令(1.6)猜扮;
  • 支持非堆內(nèi)存(Direct Memory)聚合計算(1.6);
  • 支持 PostgreSQL 的 Native 協(xié)議(1.6)监婶;
  • 支持 MySQL 和 Oracle 存儲過程旅赢,out 參數(shù)、多結(jié)果集返回(1.6)惑惶;
  • 支持 Zookeeper 協(xié)調(diào)主從切換煮盼、zk 序列、配置 zk 化(1.6)带污;
  • 支持庫內(nèi)分表(1.6)僵控;
  • 集群基于 ZooKeeper 管理,在線升級鱼冀,擴(kuò)容报破,智能優(yōu)化,大數(shù)據(jù)處理(2.0開發(fā)版)千绪。

6充易、基本概念

1)物理庫和物理表:在數(shù)據(jù)庫實(shí)例上部署的物理數(shù)據(jù)庫(如:MySQL 數(shù)據(jù)庫)和庫中的表;

2)邏輯表:MyCat 定義的表荸型,MyCat 將邏輯表的操作解釋為物理庫表的操作盹靴,一個邏輯表可能對應(yīng)多個物理庫表;

3)邏輯庫:MyCat 定義的邏輯表集合。


2.數(shù)據(jù)庫集群部署拓?fù)鋱D

部署拓?fù)鋱D

網(wǎng)絡(luò)資源規(guī)劃:

1稿静、MySQL 主從庫

節(jié)點(diǎn)名 主機(jī)名 IP:PORT 程序 操作系統(tǒng)
數(shù)據(jù)庫-1 DB-M 192.168.0.20:3306 MySQL 8 CentOS8
數(shù)據(jù)庫-2 DB-S1 192.168.0.21:3306 MySQL 8 CentOS8
數(shù)據(jù)庫≥3 DB-S2 192.168.0.22:3306 MySQL 8 CentOS8

2梭冠、MyCat + Keepalived 高可用集群

節(jié)點(diǎn)名 主機(jī)名 IP:PORT 程序 操作系統(tǒng)
集群節(jié)點(diǎn)-1 CLS-1 192.168.0.31:8066 / 112 MyCat / Keepalived CentOS8
集群節(jié)點(diǎn)≥2 CLS-2 192.168.0.32:8066 / 112 MyCat / Keepalived CentOS8

Keepalived Virtual IP:192.168.0.30。

3改备、MyCat 監(jiān)控節(jié)點(diǎn)

  • 主機(jī)名:Monitor
  • IP 地址:192.168.0.40:8082
  • 程序:MyCat-Web控漠,Zookeeper
  • 系統(tǒng):CentOS8

4、客戶端:同一網(wǎng)段計算機(jī)悬钳,部署 HeidiSQL 或應(yīng)用系統(tǒng)的調(diào)用程序模塊润脸。


3.MySQL8 + Replication 主備庫部署方案

1、在 MySQL 主從庫的節(jié)點(diǎn)上安裝 MySQL8 數(shù)據(jù)庫他去。

有關(guān)如何安裝 MySQL8 數(shù)據(jù)庫毙驯,請閱讀文章《RedHat/CentOS8【MySQL8】安裝、配置和管理》灾测,文章地址【http://www.reibang.com/p/b68e2120a068】爆价。

2、部署 MySQL 主從庫媳搪。

有關(guān)如何部署 MySQL8 主從數(shù)據(jù)庫铭段,請閱讀文章《數(shù)據(jù)庫架構(gòu)之【MySQL8+Replication】RDBMS 主從庫讀寫分離方案》,文章地址【http://www.reibang.com/p/af9d16ce00f9】秦爆。


4.MyCat 集群中間件的安裝和配置

以 "MyCat + Keepalived 高可用集群" 中的 "集群節(jié)點(diǎn)-1" 為例:

1序愚、安裝 OpenJDK 1.8 或 OracleJDK 1.8。

1)使用 YUM 源安裝OpenJDK 1.8等限。

[centos@CLS-1 ~]$ sudo dnf install java-1.8.0-openjdk

2)驗(yàn)證Java運(yùn)行環(huán)境爸吮。

[centos@CLS-1 ~]$ java -vserion
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

2、打開 MyCat 下載頁面【http://dl.mycat.org.cn/】望门,下載 MyCat 的編譯程序 tar 包到用戶主目錄中形娇。

MyCat 下載頁面

3筹误、解壓縮編譯程序 tar 包到"/usr/local"目錄中桐早。

[centos@CLS-1 ~]$ sudo tar xvf mycat2-1.11-05.tar.gz -C /usr/local
[centos@CLS-1 ~]$ ll /usr/local
drwxr-xr-x. 7 root root    67 5月  11 22:31 mycat

4、創(chuàng)建 MyCat 管理用戶和組厨剪,并設(shè)置為程序安裝目錄的擁有者哄酝。

[centos@CLS-1 ~]$ sudo id mycat
id: “mycat”:無此用戶
[centos@CLS-1 ~]$ sudo groupadd mycat
[centos@CLS-1 ~]$ sudo useradd -g mycat -s /bin/false mycat
[centos@CLS-1 ~]$ sudo chown -R mycat:mycat /usr/local/mycat

5、設(shè)置 MyCat 的配置文件參數(shù)祷膳。

使用文本編輯器打開配置文件:

[centos@CLS-1 ~]$ sudo gedit /usr/local/mycat/conf/mycat.yml

修改或驗(yàn)證文件中的以下參數(shù)并保存:

# 元數(shù)據(jù)
metadata:
  # 邏輯庫陶衅,可以設(shè)置多個邏輯庫
  schemas: [ { 
    # 邏輯庫名稱
    schemaName: 'db',
    # 邏輯庫映射的數(shù)據(jù)源或讀寫分離集群
    targetName: 'repli',
    # 定義全局表(各個節(jié)點(diǎn)的數(shù)據(jù)是一致的,主要用于讀寫分離)
    globalTables: {
      # 全局表名稱
      tbl_global: {
        # 建庫腳本(用于 MyCat 分析數(shù)據(jù)結(jié)構(gòu))
        createTableSQL: 'CREATE TABLE `tbl_global` (`uid` INT NOT NULL AUTO_INCREMENT,`name` VARCHAR(50) NOT NULL,PRIMARY KEY (`uid`))',
        # 全局表映射的數(shù)據(jù)源節(jié)點(diǎn)集合
        #【targetName】全局表映射的數(shù)據(jù)源名稱
        #【schemaName】全局表映射的物理數(shù)據(jù)庫名稱
        #【tableName】全局表映射的物理表名稱
        dataNodes: [
          { targetName: 'ds1',schemaName: 'testdb', tableName: 'tbl_global' }
        ]
      }
    },
    # 定義分片表(數(shù)據(jù)分布存儲在各個節(jié)點(diǎn)的同構(gòu)表中钾唬,主要用于并發(fā)計算)
    # MyCat 提供按固定万哪、枚舉侠驯、時間抡秆、范圍等十余種分片規(guī)則奕巍,以下只示例了固定分片和枚舉分片規(guī)則,更多規(guī)則可參見:
    # https://github.com/MyCATApache/Mycat2/blob/master/doc/17-partitioning-algorithm.md
    shadingTables: {
      # 固定分片
      tbl_shad: {
        # 分片規(guī)則:
        #【columnName】用于劃分?jǐn)?shù)據(jù)分片的字段
        #【shardingType】分片的類型:NATURE_DATABASE_TABLE 表示固定分片儒士,即根據(jù)一列(支持)或者多個列(暫不支持)的值映射成一個值,再根據(jù)該值通過單維度的分片算法計算出數(shù)據(jù)分片范圍的止;
        #【function】PartitionByLong 分片算法:
        # 分片長度是分片范圍的一種度量,總量是1024着撩,每個 dataNode (分片節(jié)點(diǎn))可以占有一個范圍的分片長度诅福。
        # 其中:partitionCount 是分片數(shù)量的數(shù)組,partitionLength 是每個分片長度的數(shù)組拖叙。
        # 本例:1024 = 2X256+1X512
        columns: [ { 
          columnName: 'uid',
          shardingType: 'NATURE_DATABASE_TABLE',
          function: { clazz: 'io.mycat.router.function.PartitionByLong', name: 'partitionByLong', properties: {partitionCount: '1,2', partitionLength: '512,256'}, ranges: {}}
        } ],
        # 建庫腳本(用于 MyCat 分析數(shù)據(jù)結(jié)構(gòu))
        createTableSQL: 'CREATE TABLE `tbl_shad` (`uid` INT NOT NULL AUTO_INCREMENT,`name` VARCHAR(50) NOT NULL,PRIMARY KEY (`uid`))',
        # 分片表映射的數(shù)據(jù)源節(jié)點(diǎn)集合
        #【targetName】分片表映射的數(shù)據(jù)源名稱
        #【schemaName】分片表映射的物理數(shù)據(jù)庫名稱
        #【tableName】分片表映射的物理表名稱
        dataNodes: [
          { targetName: 'ds1',schemaName: 'shaddb1', tableName: 'tbl_shad' },
          { targetName: 'ds1',schemaName: 'shaddb2', tableName: 'tbl_shad' },
          { targetName: 'ds1',schemaName: 'shaddb3', tableName: 'tbl_shad' }
        ]
      },
      # 枚舉分片
      tbl_shad_em: {
        # 分片規(guī)則:
        #【columnName】用于劃分?jǐn)?shù)據(jù)分片的字段
        #【function】PartitionByFileMap 分片算法:
        # 按照指定的數(shù)據(jù)字典進(jìn)行分片路由氓润,一般應(yīng)用于按照租戶賬號或區(qū)域的方式計算數(shù)據(jù)分片范圍。
        # 其中:type 是分片字段的類型薯鳍,可以是:Integer,Byte,Char,String,Long,Double,Float,Short,Boolean,BigInteger,BigDecimal咖气;
        # defaultNode 是無匹配字典時默認(rèn)路由的分片,<0表示不進(jìn)行路由挖滤;
        # ranges 是字段值對應(yīng)的 dataNodes 數(shù)組序號
        # 本例:當(dāng) shad 字段的值是 10001 時崩溪,將此腳本路由到 shaddb1 庫的 tbl_shad_em 表上。
        columns: [ { 
          columnName: 'shad',
          function: { clazz: 'io.mycat.router.function.PartitionByFileMap', name: 'PartitionByFileMap', properties: { type: Integer, defaultNode: -1 }, ranges: { 10001: 0, 10002: 1, 10003: 2 }}
        } ],
        createTableSQL: 'CREATE TABLE `tbl_shad_em` (`uid` INT NOT NULL AUTO_INCREMENT,`name` VARCHAR(50) NOT NULL,`shad` INT NOT NULL, PRIMARY KEY (`uid`))',
        dataNodes: [
          { targetName: 'ds1',schemaName: 'shaddb1', tableName: 'tbl_shad_em' },
          { targetName: 'ds1',schemaName: 'shaddb2', tableName: 'tbl_shad_em' },
          { targetName: 'ds1',schemaName: 'shaddb3', tableName: 'tbl_shad_em' }
        ]
      }
     }
  } ]
# 用戶認(rèn)證和SQL腳本匹配攔截器
interceptors: [ {
  # 用戶攔截器
  #【ip】客戶端IP斩松,支持正則表達(dá)式
  #【username】登錄用戶
  #【password】登錄用戶口令
  user:{ ip: '.',username: 'root',password: 'password' },
  # 事務(wù)模式伶唯,可選項(xiàng)為:xa 和 proxy,默認(rèn)是 proxy
  # transactionType: proxy
} ]
# 數(shù)據(jù)源
datasource:
  # 數(shù)據(jù)源集合
  datasources: [{
    # 數(shù)據(jù)源名稱
    name: 'ds1', 
    # 數(shù)據(jù)庫IP地址
    ip: '192.168.0.20',
    # 數(shù)據(jù)庫服務(wù)端口
    port: '3306',
    # 數(shù)據(jù)庫登錄用戶
    user: 'root',
    # 數(shù)據(jù)庫登錄用戶口令
    password: 'password',
    # 最大連接數(shù)
    maxCon: 10000,
    # 最小連接數(shù)
    minCon: 0,
    # 連接重試次數(shù)
    maxRetryCount: 3,
    # 連接超時時間惧盹,單位:毫秒
    maxConnectTimeout: 10000, 
    # 數(shù)據(jù)庫類型乳幸,可選項(xiàng):mysql 或 jdbc
    dbType: 'mysql', 
    # 數(shù)據(jù)庫連接字符串
    url: 'jdbc:mysql://192.168.0.20:3306?characterEncoding=utf8&useSSL=true&allowMultiQueries=true',
    # 負(fù)載均衡權(quán)重
    weight: 1, 
    # 與后端數(shù)據(jù)庫建立連接后執(zhí)行的初始化 SQL 腳本,如:"use mysql"
    initSqls: [],  
    # READ,WRITE,READ_WRITE ,集群信息中是主節(jié)點(diǎn),則默認(rèn)為讀寫,副本則為讀,此屬性可以強(qiáng)制指定可寫
    instanceType: ,
    # JDBC 每次獲取連接是否都執(zhí)行 initSqls 腳本
    initSqlsGetConnection: true
  },
  {
    name: 'ds2', 
    ip: '192.168.0.21',
    port: '3306',
    user: 'root',
    password: 'password',
    maxCon: 10000,
    minCon: 0,
    maxRetryCount: 3,
    maxConnectTimeout: 10000, 
    dbType: 'mysql', 
    url: 'jdbc:mysql://192.168.0.21:3306?characterEncoding=utf8&useSSL=true&allowMultiQueries=true',
    weight: 1, 
    initSqls: [],  
    instanceType: ,
    initSqlsGetConnection: true
  },
  {
    name: 'ds3', 
    ip: '192.168.0.22',
    port: '3306',
    user: 'root',
    password: 'password',
    maxCon: 10000,
    minCon: 0,
    maxRetryCount: 3,
    maxConnectTimeout: 10000, 
    dbType: 'mysql', 
    url: 'jdbc:mysql://192.168.0.22:3306?characterEncoding=utf8&useSSL=true&allowMultiQueries=true',
    weight: 1, 
    initSqls: [],  
    instanceType: ,
    initSqlsGetConnection: true
  } ]
  # MyCat 數(shù)據(jù)源實(shí)現(xiàn)類
  datasourceProviderClass: 'io.mycat.datasource.jdbc.datasourceProvider.AtomikosDatasourceProvider'
  # 心跳定時器钧椰,表示 MyCat 啟動后反惕,延遲 initialDelay 秒后連接后端數(shù)據(jù)源。
  timer: {initialDelay: 0, period: 3, timeUnit: 'SECONDS'}
# 讀寫分離集群
cluster:
  # 關(guān)閉集群心跳,此時集群認(rèn)為所有數(shù)據(jù)源都是可用的演侯,可以通過 MyCat 提供的外部接口設(shè)置數(shù)據(jù)源可用信息達(dá)到相同效果
  close: true
  # 集群集合
  clusters: [ {
    # 集群名稱
    name: 'repli',
    # 集群類型:SINGLE_NODE(單一節(jié)點(diǎn))姿染,MASTER_SLAVE(主從集群) ,GARELA_CLUSTER(多主集群)
    replicaType: 'MASTER_SLAVE', 
    # 切換類型:NOT_SWITCH(不進(jìn)行主從切換)秒际,SWITCH(進(jìn)行主從切換)
    switchType: 'SWITCH', 
    # 查詢請求的負(fù)載均衡類型悬赏,BALANCE_ALL(所有數(shù)據(jù)源參與負(fù)載均衡),BALANCE_ALL_READ(從庫數(shù)據(jù)源參與負(fù)載均衡)娄徊,BALANCE_NONE:(無負(fù)載均衡)
    readBalanceType: 'BALANCE_ALL', 
    # 查詢請求的負(fù)載均衡插件
    readBalanceName: 'BalanceRoundRobin',  
    # 修改請求的負(fù)載均衡插件
    writeBalanceName: 'BalanceRoundRobin',  
    # 主節(jié)點(diǎn)列表,普通主從,當(dāng)主失去連接后,依次選擇列表中存活的作為主節(jié)點(diǎn)
    masters: [ 'ds1', 'ds2' ],  
    # 從節(jié)點(diǎn)列表
    replicas: [ 'ds3' ], 
    # 集群最占用大連接限制
    maxCon: , 
    # 心跳設(shè)置
    heartbeat: {
      # 心跳重試次數(shù)
      maxRetry: 3, 
      # 最小主從切換間隔
      minSwitchTimeInterval: 120000, 
      # 心跳超時值闽颇,單位(毫秒)
      heartbeatTimeout: 100000,
      # MySQL 二進(jìn)制日志(binlog)延遲值
      slaveThreshold: 0, 
      # 進(jìn)行心跳的方式,mysql或者jdbc兩種
      requestType: 'mysql'
    }
  } ]
  timer: { initialDelay: 10, period: 5, timeUnit: 'SECONDS' }
# 插件
plug:
  # 負(fù)載均衡算法實(shí)現(xiàn)類
  # BalanceLeastActive
  # 最少正在使用的連接數(shù)的 MySQL 數(shù)據(jù)源被選中,如果連接數(shù)相同寄锐,則從連接數(shù)相同的數(shù)據(jù)源中的隨機(jī)兵多,使慢的機(jī)器收到更少尖啡。
  # BalanceRandom
  # 利用隨機(jī)算法產(chǎn)生隨機(jī)數(shù),然后從活躍的mysql數(shù)據(jù)源中進(jìn)行選取剩膘。
  # BalanceRoundRobin
  # 加權(quán)輪訓(xùn)算法衅斩,記錄輪訓(xùn)的權(quán)值,每次訪問加一怠褐,得到n畏梆,然后對 MySQL 數(shù)據(jù)源進(jìn)行輪訓(xùn),如果權(quán)值已經(jīng)為零奈懒,則跳過奠涌,如果非零則減一,n減1磷杏,直n為零則選中的節(jié)點(diǎn)就是需要訪問的mysql數(shù)據(jù)源節(jié)點(diǎn)溜畅。
  # BalanceRunOnReplica
  # 把請求盡量發(fā)往從節(jié)點(diǎn),不會把請求發(fā)到不可讀(根據(jù)延遲值判斷)與不可用的從節(jié)點(diǎn)
  loadBalance:
    defaultLoadBalance: 'balanceRandom'
    loadBalances: [
      { name: 'BalanceRunOnMaster', clazz: 'io.mycat.plug.loadBalance.BalanceRunOnMaster' },
      { name: 'BalanceLeastActive', clazz: 'io.mycat.plug.loadBalance.BalanceLeastActive' },
      { name: 'BalanceRoundRobin', clazz: 'io.mycat.plug.loadBalance.BalanceRoundRobin' },
      { name: 'BalanceRunOnReplica', clazz: 'io.mycat.plug.loadBalance.BalanceRunOnReplica' },
      { name: 'BalanceRunOnRandomMaster', clazz: 'io.mycat.plug.loadBalance.BalanceRunOnRandomMaster' }
    ]
# 服務(wù)器
server:
  # 監(jiān)聽 IP 地址
  ip: 0.0.0.0
  # 監(jiān)控服務(wù)端口
  port: 8066
  reactorNumber: 1
properties:
  key: 'value'

#lib start
#lib end

MyCat 配置相關(guān)資料:
https://gitee.com/cos9527/Mycat2/blob/master/doc/00-mycat-readme.md
https://www.ctolib.com/MyCATApache-Mycat2.html#articleHeader7
https://github.com/MyCATApache/Mycat2/blob/master/doc

6、配置 MyCat 服務(wù)開機(jī)自啟動极祸。

使用文本編輯器創(chuàng)建配置文件:

[centos@CLS-1 ~]$ sudo gedit /usr/lib/systemd/system/mycat.service

編寫文件內(nèi)容并保存如下:

[Unit]
Description=MyCat2 Server
After=syslog.target network.target

[Service]
Type=forking
User=mycat
Group=mycat

ExecStart=/usr/local/mycat/bin/mycat start
ExecStop=/usr/local/mycat/bin/mycat stop
ExecReload=/usr/local/mycat/bin/mycat restart

[Install]
WantedBy=multi-user.target

設(shè)置開機(jī)啟動:

[centos@CLS-1 ~]$ sudo systemctl daemon-reload
[centos@CLS-1 ~]$ sudo systemctl enable mycat.service

7慈格、啟動 MyCat 服務(wù)。

[centos@CLS-1 ~]$ sudo systemctl start mycat.service

8贿肩、設(shè)置防火墻端口(CentOS8默認(rèn)安裝firewall防火墻)峦椰,允許"8066"端口(MyCat 默認(rèn)端口)訪問服務(wù)器。

[centos@CLS-1 ~]$ sudo firewall-cmd --zone=public --add-port=8066/tcp --permanent
[centos@CLS-1 ~]$ sudo firewall-cmd --reload

注意:其他"MyCat + Keepalived 高可用集群"節(jié)點(diǎn)上全部需要按照以上步驟配置汰规。

9汤功、MyCat 運(yùn)維管理

1)啟動 MyCat 服務(wù)(任選一種方式)

[centos@CLS-1 ~]$ sudo systemctl start mycat.service

或者

[centos@CLS-1 ~]$ sudo -u mycat /usr/local/mycat/bin/mycat start

2)停止 MyCat 服務(wù)(任選一種方式)

[centos@CLS-1 ~]$ sudo systemctl stop mycat.service

或者

[centos@CLS-1 ~]$ sudo -u mycat /usr/local/mycat/bin/mycat stop

3)重啟 MyCat 服務(wù)

[centos@CLS-1 ~]$ sudo systemctl restart mycat.service

或者

[centos@CLS-1 ~]$ sudo -u mycat /usr/local/mycat/bin/mycat restart

4)查看 MyCat 服務(wù)狀態(tài)

[centos@CLS-1 ~]$ sudo systemctl status mycat.service

或者

[centos@CLS-1 ~]$ sudo netstat -ntap | grep 8066
tcp6       0      0 :::8066                 :::*                    LISTEN      9688/java

5)啟動 MyCat 服務(wù)開機(jī)自啟動

[centos@CLS-1 ~]$ sudo systemctl enable mycat.service

6)禁用 MyCat 服務(wù)開機(jī)自啟動

[centos@CLS-1 ~]$ sudo systemctl disable mycat.service

5.Keepalived 高可用中間件的安裝和配置

以 "MyCat + Keepalived 高可用集群" 中的 "集群節(jié)點(diǎn)-1" 為例:

1、安裝 EPEL 的 Yum源溜哮。

使用文本編輯器創(chuàng)建倉庫配置文件:

[centos@CLS-1 ~ ]$ sudo gedit /etc/yum.repos.d/epel.repo

在文件中編寫以下內(nèi)容并保存:

[epel-modular]
name=Extra Packages for Enterprise Linux Modular $releasever - $basearch
baseurl=http://mirrors.aliyun.com/epel/$releasever/Modular/$basearch
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8

[epel]
name=Extra Packages for Enterprise Linux $releasever - $basearch
baseurl=http://mirrors.aliyun.com/epel/$releasever/Everything/$basearch
enabled=1
gpgcheck=1
gpgkey=http://mirrors.aliyun.com/epel/RPM-GPG-KEY-EPEL-8

更新 Yum 源:

[centos@CLS-1 ~]$ sudo dnf clean all
[centos@CLS-1 ~]$ sudo dnf makecache
Extra Packages for Enterprise Linux Modular 8 - 429 kB/s | 118 kB     00:00    
Extra Packages for Enterprise Linux 8 - x86_64  3.7 MB/s | 6.9 MB     00:01    
元數(shù)據(jù)緩存已建立滔金。

EPEL(Extra Packages for Enterprise Linux)是企業(yè)級 Linux 操作系統(tǒng)的擴(kuò)展包倉庫,為 Redhat/CentOS系統(tǒng)提供大量的額外軟件包茂嗓。

2餐茵、安裝 Keepalived。

[centos@CLS-1 ~]$ sudo dnf install keepalived

程序安裝目錄是"/usr/sbin"述吸,配置文件目錄是"/etc/keepalived"忿族。

3、設(shè)置 Keepalived 配置文件參數(shù)蝌矛。

使用文本編輯器打開配置文件:

[centos@CLS-1 ~ ]$ sudo gedit /etc/keepalived/keepalived.conf

在文件中編寫以下內(nèi)容并保存:

# 定義全局配置
global_defs {
    # 本地節(jié)點(diǎn) ID 標(biāo)識道批,一般設(shè)置為主機(jī)名。
    router_id mycat-1
}

# 定義周期性執(zhí)行的腳本入撒,腳本的退出狀態(tài)碼會被調(diào)用它的所有的 vrrp_instance 記錄隆豹。
vrrp_script chk_mycat {
    # 執(zhí)行腳本的路徑。
    script "/etc/keepalived/mycat_check.sh"
    # 腳本執(zhí)行的間隔(單位是秒)茅逮。默認(rèn)為1s璃赡。
    interval 2
    # 當(dāng)腳本調(diào)整優(yōu)先級判哥,從 -254 到 254。默認(rèn)為2碉考。
    # 1. 如果腳本執(zhí)行成功(退出狀態(tài)碼為0)塌计,weight大于0,則priority增加豆励。
    # 2. 如果腳本執(zhí)行失敗(退出狀態(tài)碼為非0)夺荒,weight小于0瞒渠,則priority減少良蒸。
    # 3. 其他情況下,priority不變伍玖。
    weight -20
    # 當(dāng)腳本執(zhí)行超過時長(單位是秒)則被認(rèn)為執(zhí)行失敗嫩痰。
    # 運(yùn)行腳本的用戶和組。
    user root root
    # timeout 30
    # 當(dāng)腳本執(zhí)行成功到設(shè)定次數(shù)時窍箍,才認(rèn)為是成功串纺。
    # rise 1
    # 當(dāng)腳本執(zhí)行失敗到設(shè)定次數(shù)時,才認(rèn)為是失敗椰棘。
    # fall 3
}

# 定義虛擬路由纺棺,可以定義多個。
vrrp_instance VI_1 {
    # 本地節(jié)點(diǎn)初始狀態(tài)邪狞,包括 MASTER(主節(jié)點(diǎn)) 和 BACKUP (備節(jié)點(diǎn))祷蝌。
    state MASTER
    # 本地節(jié)點(diǎn)綁定虛擬 IP 的網(wǎng)絡(luò)接口。
    interface ens33
    # 本地節(jié)點(diǎn)優(yōu)先級帆卓,優(yōu)先級高的節(jié)點(diǎn)將動態(tài)變成 MASTER 節(jié)點(diǎn)巨朦,接管 VIP 。初始狀態(tài)下剑令,MASTER 節(jié)點(diǎn)的優(yōu)先級必須高于 BACKUP 節(jié)點(diǎn)糊啡。
    priority 100
    # VRRP 實(shí)例 ID,范圍是0-255吁津。同一集群的所有節(jié)點(diǎn)應(yīng)設(shè)置一致的值棚蓄。
    virtual_router_id 216
    # 組播信息發(fā)送時間間隔。同一集群的所有節(jié)點(diǎn)必須設(shè)置一樣碍脏,默認(rèn)為1秒梭依。
    advert_int 1
    # 設(shè)置驗(yàn)證信息。同一集群的所有節(jié)點(diǎn)必須一致
    authentication {
        # 指定認(rèn)證方式潮酒。PASS 表示簡單密碼認(rèn)證(推薦)睛挚;AH:IPSEC認(rèn)證(不推薦)。
        auth_type PASS
        # 指定認(rèn)證所使用的密碼急黎,最多8位扎狱。
        auth_pass 1111
    }

    # 聲明調(diào)用已定義的 vrrp_script 腳本侧到。
    track_script {
        chk_mycat
    }

    # 定義虛擬 IP 地址。
    virtual_ipaddress {
        192.168.0.30
    }
}

# 定義對外提供服務(wù) LVS (負(fù)載均衡)的 VIP 和 端口(當(dāng)端口號設(shè)置為【0】時淤击,表示所有端口)匠抗,只實(shí)現(xiàn)高可用時可不配置。
virtual_server 192.168.0.30 8066 {  
    # 設(shè)置健康檢查時間污抬,單位是秒
    delay_loop 6 
    #負(fù)載均衡調(diào)度算法
    lb_algo rr
    # 設(shè)置LVS實(shí)現(xiàn)負(fù)載的機(jī)制汞贸,有NAT、TUN印机、DR三個模式    
    lb_kind DR
    # VIP 子網(wǎng)掩碼
    nat_mask 255.255.255.0
    # 會話保持時間,一定時間之內(nèi)用戶無響應(yīng)則下一次用戶請求時需重新路由矢腻,一般設(shè)為0,表示不需要    
    persistence_timeout 0
    # 網(wǎng)絡(luò)協(xié)議
    protocol TCP
    # 定義后端 RealServer 的真實(shí)服務(wù)器屬性射赛,IP 地址和端口(當(dāng)端口號設(shè)置為【0】時多柑,表示所有端口)
    real_server 192.168.0.31 8066 { 
        # 配置節(jié)點(diǎn)權(quán)值,數(shù)字越大權(quán)重越高 
        weight 1
        TCP_CHECK {  
            connect_timeout 10         
            nb_get_retry 3  
            delay_before_retry 3  
            connect_port 8066
        }  
    }  
    real_server 192.168.0.32 8066 {
        weight 1
        TCP_CHECK {  
            connect_timeout 10  
            nb_get_retry 3  
            delay_before_retry 3  
            connect_port 8066
        }  
    }
}

初始化的主節(jié)點(diǎn)和備節(jié)點(diǎn)的區(qū)別體現(xiàn)在以下參數(shù)中:

  • 初始主節(jié)點(diǎn)
vrrp_instance VI_1 {
    # 必須設(shè)置為 MASTER 楣责。
    state MASTER
    # 必須設(shè)置為最大值竣灌。
    priority 100
}
  • 初始備節(jié)點(diǎn)
vrrp_instance VI_1 {
    # 必須設(shè)置為 BACKUP 。
    state BACKUP
    # 必須設(shè)置為小于主節(jié)點(diǎn)的值秆麸。
    priority 90
}

4初嘹、創(chuàng)建或編輯 MyCat 檢測腳本文件。文件路徑對應(yīng)配置文件中 vrrp_script 的 script 設(shè)置值沮趣。

使用文本編輯器創(chuàng)建腳本文件:

[centos@CLS-1 ~ ]$ sudo gedit /etc/keepalived/mycat_check.sh

在腳本文件中編寫以下內(nèi)容并保存:

#!/bin/bash
if [ ! -f "/usr/local/mycat/logs/mycat.pid" ]; then
    sudo -u mycat /usr/local/mycat/bin/mycat restart
    sleep 2
    if [ ! -f "/usr/local/mycat/logs/mycat.pid" ]; then
        killall -9 keepalived
    fi
fi

給腳本文件增加可執(zhí)行權(quán)限:

[centos@CLS-1 ~ ]$ sudo chmod 755 /etc/keepalived/mycat_check.sh

5屯烦、配置 Keepalived 系統(tǒng)服務(wù)。

使用文本編輯器創(chuàng)建配置文件:

[centos@CLS-1 ~ ]$ sudo gedit /usr/lib/systemd/system/keepalived.service

驗(yàn)證或修改文件內(nèi)容并保存如下:

[Unit]
Description=LVS and VRRP High Availability Monitor
After=network-online.target syslog.target
Wants=network-online.target

[Service]
Type=forking
User=root
Group=root
PIDFile=/var/run/keepalived.pid
KillMode=process
EnvironmentFile=-/etc/sysconfig/keepalived
ExecStart=/usr/sbin/keepalived $KEEPALIVED_OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
ExecStop=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

重新加載系統(tǒng)服務(wù)管理器:

[centos@CLS-1 ~ ]$ sudo systemctl daemon-reload

6兔毒、設(shè)置防火墻端口(CentOS8默認(rèn)安裝firewall防火墻)漫贞,允許"112"端口(Keepalived 默認(rèn)端口)訪問服務(wù)器。

[centos@CLS-1 ~ ]$ sudo firewall-cmd --zone=public --add-port=112/tcp --permanent
[centos@CLS-1 ~ ]$ sudo firewall-cmd --reload

7育叁、啟動/重啟 Keepalived 服務(wù)(不建議設(shè)置為開機(jī)自啟動)迅脐。

啟動 Keepalived 服務(wù)之前,應(yīng)確保已正確啟動了各節(jié)點(diǎn)的 MyCat 服務(wù)豪嗽。各節(jié)點(diǎn)的啟動或重啟的順序?yàn)椋孩?啟動 Keepalived 主節(jié)點(diǎn)谴蔑;② 依次啟動 Keepalived 備節(jié)點(diǎn)。

[centos@CLS-1 ~ ]$ sudo systemctl restart keepalived.service

8龟梦、啟動 Keepalived 可能因?yàn)楦鞣N未知的原因失敗隐锭,主要是由于引發(fā)了 SELinux 異常。有關(guān)如何解決 SELinux 引起的異常计贰,請閱讀文章《RedHat/CentOS8【SELinux】引起的安全策略問題解決方案》钦睡,文章地址【http://www.reibang.com/p/a13f974f8bae】。

注意:其他"MyCat + Keepalived 高可用集群"節(jié)點(diǎn)上全部需要按照以上步驟配置躁倒。


6.MyCat 監(jiān)控中間件的安裝和配置

1荞怒、安裝 OpenJDK 1.8 或 OracleJDK 1.8洒琢。

1)使用 YUM 源安裝OpenJDK 1.8。

[centos@Monitor ~]$ sudo dnf install java-1.8.0-openjdk

2)驗(yàn)證Java運(yùn)行環(huán)境褐桌。

[centos@Monitor ~]$ java -vserion
openjdk version "1.8.0_252"
OpenJDK Runtime Environment (build 1.8.0_252-b09)
OpenJDK 64-Bit Server VM (build 25.252-b09, mixed mode)

2衰抑、打開 MyCat 下載頁面【http://dl.mycat.org.cn/】,下載 MyCat-Web 和 Zookeeper 的編譯程序 tar 包到用戶主目錄中荧嵌。

MyCat-Web 和 Zookeeper 下載頁面

3呛踊、解壓縮 Zookeeper 編譯程序 tar 包到"/usr/local"目錄中。

[centos@Monitor ~]$ sudo tar xvf zookeeper-3.4.6.tar.gz -C /usr/local
[centos@Monitor ~]$ ll /usr/local
drwxr-xr-x. 10 root root  4096 2月  20 2014 zookeeper-3.4.6

4啦撮、從模板創(chuàng)建 Zookeeper 配置文件谭网。

[centos@Monitor ~]$ sudo cp /usr/local/zookeeper-3.4.6/conf/zoo_sample.cfg /usr/local/zookeeper-3.4.6/conf/zoo.cfg

5、配置 Zookeeper 服務(wù)開機(jī)自啟動逻族。

使用文本編輯器創(chuàng)建配置文件:

[centos@Monitor ~]$ sudo gedit /usr/lib/systemd/system/zookeeper.service

編寫文件內(nèi)容并保存如下:

[Unit]
Description=Zookeeper Server
After=syslog.target network.target

[Service]
Type=forking
User=root
Group=root

ExecStart=/usr/local/zookeeper-3.4.6/bin/zkServer.sh start
ExecStop=/usr/local/zookeeper-3.4.6/bin/zkServer.sh stop
ExecReload=/usr/local/zookeeper-3.4.6/bin/zkServer.sh restart

[Install]
WantedBy=multi-user.target

設(shè)置開機(jī)啟動:

[centos@Monitor ~]$ sudo systemctl daemon-reload
[centos@Monitor ~]$ sudo systemctl enable zookeeper.service

6蜻底、啟動 Zookeeper 服務(wù)骄崩。

[centos@Monitor ~]$ sudo systemctl start zookeeper.service

7聘鳞、設(shè)置防火墻端口(CentOS8默認(rèn)安裝firewall防火墻),允許"2181"端口(Zookeeper 默認(rèn)端口)訪問服務(wù)器要拂。

[centos@Monitor ~ ]$ sudo firewall-cmd --zone=public --add-port=2181/tcp --permanent
[centos@Monitor ~ ]$ sudo firewall-cmd --reload

8抠璃、解壓縮 MyCat-Web 編譯程序 tar 包到"/usr/local"目錄中。

[centos@Monitor ~]$ sudo tar xvf Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz -C /usr/local
[centos@Monitor ~]$ ll /usr/local
drwxrwxrwx. 5 root  root     96 10月 20 2015 mycat-web

9脱惰、設(shè)置 MyCat-Web 配置文件參數(shù)搏嗡。

使用文本編輯器打開配置文件:

[centos@Monitor ~ ]$ sudo gedit /usr/local/mycat-web/mycat-web/WEB-INF/classes/mycat.properties

在文件中編寫以下內(nèi)容并保存:

show.period=3000000
# Zookeeper 服務(wù)器IP和端口號
zookeeper=127.0.0.1:2181

mycat_warn_mail=[{"cc"\:"sohudo@mycat.io","index"\:1,"mangerPort"\:"465","smtpHost"\:"smtp.139.com","smtpPassword"\:"123456","smtpProtocol"\:"smtp","smtpUser"\:"agile_louie@139.com","to"\:"9183838@qq.com"}]
##sql\u4E0A\u7EBF\u76F8\u5173\u914D\u7F6E

# MyCat 服務(wù)器IP地址
sqlonline.server=192.168.0.20
# MyCat 登錄用戶
sqlonline.user=root
# MyCat 登錄用戶口令
sqlonline.passwd=123456a?

10、設(shè)置防火墻端口(CentOS8默認(rèn)安裝firewall防火墻)拉一,允許"8082"端口(MyCat-Web 默認(rèn)端口)訪問服務(wù)器采盒。

[centos@Monitor ~ ]$ sudo firewall-cmd --zone=public --add-port=8082/tcp --permanent
[centos@Monitor ~ ]$ sudo firewall-cmd --reload

11、啟動 MyCat-Web 服務(wù)蔚润。

[centos@Monitor ~]$ cd /usr/local/mycat-web
[centos@Monitor mycat-web]$ ./start.sh

12磅氨、驗(yàn)證 MyCat-Web 服務(wù)正常運(yùn)行。使用瀏覽器客戶端訪問 MyCat-Web 的 Http 服務(wù)接口進(jìn)行測試嫡纠,輸入:http://<IP>:<PORT>/mycat烦租,默認(rèn)端口是【8082】。

MyCat-Web 正常訪問頁面

13除盏、MyCat Web 運(yùn)維管理

1)啟動 MyCat Web 服務(wù)(任選一種方式)

[centos@Monitor ~]$ cd /usr/local/mycat-web
[centos@Monitor mycat-web]$ ./start.sh

2)停止 MyCat 服務(wù)(任選一種方式)

[centos@Monitor ~]$ sudo netstat -ntap | grep 8082
tcp6       0      0 :::8082                 :::*                    LISTEN      78278/java
[centos@Monitor ~]$ sudo kill -9 78278

3)重啟 MyCat 服務(wù)

[centos@Monitor ~]$ sudo netstat -ntap | grep 8082
tcp6       0      0 :::8082                 :::*                    LISTEN      78278/java
[centos@Monitor ~]$ sudo kill -9 78278
[centos@Monitor ~]$ cd /usr/local/mycat-web
[centos@Monitor mycat-web]$ ./start.sh

4)查看 MyCat 服務(wù)狀態(tài)

[centos@Monitor ~]$ sudo netstat -ntap | grep 8082
tcp6       0      0 :::8082                 :::*                    LISTEN      78278/java
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末叉橱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子者蠕,更是在濱河造成了極大的恐慌窃祝,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件踱侣,死亡現(xiàn)場離奇詭異粪小,居然都是意外死亡甩栈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門糕再,熙熙樓的掌柜王于貴愁眉苦臉地迎上來量没,“玉大人囱持,你說我怎么就攤上這事佳谦。” “怎么了蜘欲?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵猾担,是天一觀的道長袭灯。 經(jīng)常有香客問我,道長绑嘹,這世上最難降的妖魔是什么稽荧? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮工腋,結(jié)果婚禮上姨丈,老公的妹妹穿的比我還像新娘。我一直安慰自己擅腰,他們只是感情好蟋恬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著趁冈,像睡著了一般歼争。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渗勘,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天沐绒,我揣著相機(jī)與錄音,去河邊找鬼旺坠。 笑死乔遮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的价淌。 我是一名探鬼主播申眼,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蝉衣!你這毒婦竟也來了括尸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤病毡,失蹤者是張志新(化名)和其女友劉穎濒翻,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡有送,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年淌喻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片雀摘。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡裸删,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出阵赠,到底是詐尸還是另有隱情涯塔,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布清蚀,位于F島的核電站匕荸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏枷邪。R本人自食惡果不足惜榛搔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望东揣。 院中可真熱鬧践惑,春花似錦、人聲如沸救斑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽脸候。三九已至,卻和暖如春绑蔫,著一層夾襖步出監(jiān)牢的瞬間运沦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工配深, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留携添,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓篓叶,卻偏偏與公主長得像烈掠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缸托,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353