postgresql集群的搭建

目錄

  • 架構(gòu)圖
  • 部署詳情
  • postgresql的安裝與配置
  • pgpool的安裝與配置

寫在安裝前

postgresql是一款很強(qiáng)大的數(shù)據(jù)庫屹篓,具體有多強(qiáng)大呢靶瘸,請谷歌晃危。。梨水。
網(wǎng)上的相關(guān)資料不是很多拭荤,參考了大神們的文檔,結(jié)合自己趟了的坑疫诽,寫了pg集群的安裝文檔舅世。可能有一些參數(shù)沒有配置好奇徒,希望大神們指出雏亚,謝謝。參照本文檔摩钙,基本能實(shí)現(xiàn)pg的高可用罢低,稍后會(huì)寫出測試文檔。

架構(gòu)圖

部署詳情

ip host 系統(tǒng) vip 部署
192.168.123.180 master CentOS 6.8 192.168.123.183 postgresql胖笛、pgpool
192.168.123.181 slave1 CentOS 6.8 192.168.123.183 postgresql网持、pgpool
192.168.123.182 slave2 CentOS 6.8 192.168.123.183 postgresql

postgresql的安裝

1、安裝

1长踊、Rpm包下載地址:
https://yum.postgresql.org/rpmchart.php
下載下面的包:
postgresql95-libs-9.5.8-1PGDG.rhel6.x86_64.rpm
postgresql95-contrib-9.5.8-1PGDG.rhel6.x86_64.rpm
postgresql95-9.5.8-1PGDG.rhel6.x86_64.rpm
postgresql95-server-9.5.8-1PGDG.rhel6.x86_64.rpm

2功舀、安裝:

yum install -y postgresql95-libs-9.5.8-1PGDG.rhel6.x86_64.rpm
yum install -y postgresql95-contrib-9.5.8-1PGDG.rhel6.x86_64.rpm
yum install -y postgresql95-9.5.8-1PGDG.rhel6.x86_64.rpm
yum install -y postgresql95-server-9.5.8-1PGDG.rhel6.x86_64.rpm

3、初始化db:
service postgresql-9.5 initdb
4身弊、設(shè)置為開機(jī)啟動(dòng):
chkconfig postgresql-9.5 on
5辟汰、安裝的目錄:
/var/lib/pgsql/9.5

配置白名單與流復(fù)制

1、 master的配置

PostgreSQL流復(fù)制默認(rèn)是異步的佑刷。在主服務(wù)器上提交事務(wù)和從服務(wù)器上變化可見之間有一個(gè)小的延遲莉擒,這個(gè)延遲遠(yuǎn)小于基于文件日志傳送,通常1秒能完成瘫絮。如果主服務(wù)器突然崩潰涨冀,可能會(huì)有少量數(shù)據(jù)丟失。
同步復(fù)制必須等主服務(wù)器和從服務(wù)器都寫完WAL后才能提交事務(wù)麦萤。這樣在一定程度上會(huì)增加事務(wù)的響應(yīng)時(shí)間鹿鳖。
配置同步復(fù)制僅需要一個(gè)額外的配置步驟: synchronous_standby_names必須設(shè)置為一個(gè)非空值扁眯。synchronous_commit也必須設(shè)置為on。
這里部署的是異步的流復(fù)制

1.2翅帜、配置白名單:
vim /var/lib/pgsql/9.5/data/pg_hba.conf
在配置文件最后加上:


host   all             all              192.168.123.180/32      trust
host   all             all              192.168.123.181/32      trust
host   all             all              192.168.123.182/32      trust
host   replication      replica          192.168.123.181/32      trust
host   replication      replica          192.168.123.182/32      trust

保存退出
我這里由于是內(nèi)網(wǎng)姻檀,全部用的trust,如果要用密碼涝滴,請修改為passwd

1.3绣版、修改配置文件:
vim /var/lib/pgsql/9.5/data/postgresql.conf

data_directory = '/app/pgsql/data'                            #自定義data目錄
listen_addresses = '*'                                      #監(jiān)聽所有ip
archive_mode = on                                        #允許歸檔
archive_command = 'cp %p /app/pgsql/pg_archive/%f'           #使用命令歸檔
wal_level = hot_standby                                    #選擇熱備
max_wal_senders = 16                                     #最多多少個(gè)流復(fù)制鏈接
wal_keep_segments = 256                                  #流復(fù)制保留最多的xlog數(shù)
wal_sender_timeout = 60s                               #流復(fù)制主機(jī)發(fā)送數(shù)據(jù)超時(shí)時(shí)間
max_connections = 99                                   #從庫的max_connections必須大于主庫的

1.4、創(chuàng)建data目錄歼疮,賦權(quán)并修改啟動(dòng)文件

mkdir -p /app/pgsql/data && chown postgres:postgres /app/pgsql/data
mkdir -p /app/pgsql/pg_archive && chown postgres:postgres /app/pgsql/pg_archive

cd /app/pgsql && chmod 700 data
cd /app/pgsql && chmod 700 pg_archive

1.5杂抽、修改啟動(dòng)文件

vim /etc/init.d/postgresql-9.5

PGDATA=/app/pgsql/data

1.6、把原data目錄下的文件copy到新的data的目錄下,并改變屬組:

cp -r /var/lib/pgsql/9.5/data/* /app/pgsql/data/
cd /app/pgsql && chown -R postgres:postgres data

1.7韩脏、啟動(dòng)
service postgresql-9.5 start
以后修改配置文件就在/app/pgsql/data下面修改

1.8缩麸、創(chuàng)建一個(gè)數(shù)據(jù)庫用戶進(jìn)行主從同步。創(chuàng)建用戶replica赡矢,并賦予登錄和復(fù)制的權(quán)限
登陸到數(shù)據(jù)庫里:

su postgres
psql
CREATE ROLE replica login replication encrypted password 'replica';

防火墻開放5432端口
在從庫上:
psql -h 192.168.123.180 -U postgres

登陸主庫成功

2杭朱、從庫的配置
2.1、自定義data目錄:

mkdir -p /app/pgsql/data/&&chmod 700 /app/pgsql/data/
chown -R  postgres:postgres pgsql

mkdir /app/pgsql/pg_archive
cd /app/pgsql
chmod 700 pg_archive && chown postgres:postgres pg_archive/

2.2吹散、切換用戶:
su – postgres
2.3弧械、備份數(shù)據(jù):
pg_basebackup -h 192.168.123.180 -U replica -D /app/pgsql/data -X stream –P
2.4、修改啟動(dòng)文件:

vim /etc/init.d/postgresql-9.5

PGDATA=/app/pgsql/data

2.5空民、配置recovery.conf

su postgres
cp /usr/pgsql-9.5/share/recovery.conf.sample /app/pgsql/data/recovery.conf

vim /app/pgsql/data/recovery.conf

standby_mode = on        \#該節(jié)點(diǎn)為從
primary_conninfo = 'host=192.168.123.180 port=5432 user=replica password=replica'
                        \#主服務(wù)器的ip梦谜、user
recovery_target_timeline = 'latest'
trigger_file = '/tmp/trigger_file0'

2.6、配置postgresql.conf
vim /app/pgsql/data/postgresql.conf

max_connections = 999     #大于主的連接數(shù)
max_standby_streaming_delay = 30s
wal_receiver_status_interval = 10s
hot_standby_feedback = on

2.7袭景、重啟服務(wù):
service postgresql-9.5 restart

驗(yàn)證流復(fù)制

3.1、在master上登陸psql
查看狀態(tài):
select client_addr,sync_state from pg_stat_replication;

3.2闭树、創(chuàng)建test庫
Create database test;

3.3耸棒、slave上登陸psql
查看庫
playboy => \l

發(fā)現(xiàn)已同步。

pgpool的安裝

pgpool-II是PostgreSQL服務(wù)器之間一種有效的中間件和PostgreSQL數(shù)據(jù)庫客戶端报辱。它提供了以下功能与殃。
連接池
pgpool-II保存到PostgreSQL服務(wù)器的連接,當(dāng)一個(gè)相同新連接(如用戶名碍现、數(shù)據(jù)庫幅疼、協(xié)議版本)進(jìn)來時(shí),重用他們昼接。它減少了連接開銷爽篷,提高了系統(tǒng)的整體吞吐量。
復(fù)制
pgpool-II可以管理多個(gè)PostgreSQL服務(wù)器慢睡。使用復(fù)制功能可以使2個(gè)或更多的物理磁盤上創(chuàng)建一個(gè)實(shí)時(shí)備份逐工,這樣服務(wù)不會(huì)因服務(wù)器的磁盤故障而中斷铡溪。
負(fù)載平衡
如果數(shù)據(jù)庫是復(fù)制的,在任何服務(wù)器上執(zhí)行一個(gè)SELECT查詢會(huì)返回相同的結(jié)果泪喊。pgpool-II復(fù)制特性的優(yōu)勢在于減少每個(gè)PostgreSQL服務(wù)器上的負(fù)載棕硫,因?yàn)樗梢允褂梅植荚诙鄠€(gè)服務(wù)器之間進(jìn)行SELECT查詢,從而提高系統(tǒng)的整體吞吐量袒啼。最好是查詢和PostgreSQL服務(wù)器數(shù)量成一定比例哈扮,多用戶同時(shí)執(zhí)行多查詢達(dá)到負(fù)載均衡最好的效果。
限制連接數(shù)
PostgreSQL的最大并發(fā)連接數(shù)有一定限制的蚓再,當(dāng)超過限制的連接數(shù)后滑肉,連接會(huì)被拒絕。然而对途,設(shè)置增加最大連接數(shù)又會(huì)增加資源消耗赦邻,影響系統(tǒng)性能。pgpool-II也有最大連接數(shù)限制实檀,但超過的連接進(jìn)來時(shí)是進(jìn)行立即排隊(duì)惶洲,而不是返回一個(gè)錯(cuò)誤。
pgpool-II交互PostgreSQL的后端和前端協(xié)議時(shí)膳犹,起著繼電器的作用恬吕。因此,數(shù)據(jù)庫應(yīng)用程序(前端)認(rèn)為pgpool-II是真實(shí)的PostgreSQL服務(wù)器须床,服務(wù)器(后端)認(rèn)為pgpool-II是它的客戶端之一铐料。因?yàn)閜gpool-II在服務(wù)器和客戶端是透明的,所以pgpool-II可以使用現(xiàn)有的數(shù)據(jù)庫應(yīng)用程序而做到幾乎不修改它們豺旬。

版本:3.6
機(jī)器:192.168.123.180
192.168.123.181
4.1钠惩、免密碼登陸
安裝之前先配置密鑰使master和slave1這兩臺(tái)虛擬機(jī)的postgres用戶能免密連接

先修改postgres的密碼,在root用戶下
passwd postgres
新密碼123456

Master到slave1的免密碼登陸:
在master上切換至postgres用戶族阅,生成密鑰
su postgres ssh-keygen -t rsa
然后全輸入回車

切換到postgres用戶:
su postgres ssh-copy-id -i /var/lib/pgsql/.ssh/id_rsa 192.168.123.181
然后ssh 192.168.123.181 成功篓跛,實(shí)現(xiàn)master到slave1的免密碼登陸

Slave1到master的免密碼登陸:
流程同上
4.2、安裝
Rpm包下載地址:
http://www.pgpool.net/yum/rpms/3.6/redhat/rhel-6-x86_64/pgpool-II-pg95-3.6.0-1pgdg.rhel6.x86_64.rpm

安裝:
yum install pgpool-II-pg95-3.6.0-1pgdg.rhel6.x86_64.rpm

4.3坦刀、配置
Master的配置:

配置白名單:
要和pg_hba.conf登陸權(quán)限一致愧沟,這里由于是私有云,都用trust
vim /etc/pgpool-II/pool_hba.conf
在最后改成:


配置pcp管理工具密碼:
pg_md5 pwd
密碼加密


vim /etc/pgpool-II/pcp.conf
把剛才加密的密碼粘貼到文件里

配置系統(tǒng)命令權(quán)限:
Root用戶下:
chmod u+s /sbin/ifconfig &&chmod u+s /usr/sbin

配置中間件配置文件:
vim /etc/pgpool-II/pgpool.conf

# CONNECTIONS
listen_addresses = '*'
port = 9999
pcp_listen_addresses = '*'
pcp_port = 9898


# - Backend Connection Settings -

backend_hostname0 = 'master'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = ' /app/pgsql/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'

backend_hostname1 = 'slave'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = ' /app/pgsql/data''
backend_flag1 = 'ALLOW_TO_FAILOVER'

# - Authentication -
enable_pool_hba = off
pool_passwd = 'pool_passwd'

# FILE LOCATIONS
pid_file_name = '/opt/pgpool/pgpool.pid'

replication_mode = off
load_balance_mode = on
master_slave_mode = on
master_slave_sub_mode = 'stream'

sr_check_period = 5
sr_check_user = 'repuser'
sr_check_password = 'repuser'
sr_check_database = 'postgres'

#------------------------------------------------------------------------------
# HEALTH CHECK 健康檢查
#------------------------------------------------------------------------------

health_check_period = 10 # Health check period
                                   # Disabled (0) by default
health_check_timeout = 20
                                   # Health check timeout
                                   # 0 means no timeout
health_check_user = ' repuser '
                                   # Health check user
health_check_password = ' repuser '    #數(shù)據(jù)庫密碼
                                   # Password for health check user
health_check_database = 'postgres'
#必須設(shè)置鲤遥,否則primary數(shù)據(jù)庫down了沐寺,pgpool不知道,不能及時(shí)切換盖奈。從庫流復(fù)制還在連接數(shù)據(jù)混坞,報(bào)連接失敗。
#只有下次使用pgpool登錄時(shí)卜朗,發(fā)現(xiàn)連接不上拔第,然后報(bào)錯(cuò)咕村,這時(shí)候,才知道掛了蚊俺,pgpool進(jìn)行切換懈涛。


#主備切換的命令行配置
#------------------------------------------------------------------------------
# FAILOVER AND FAILBACK
#------------------------------------------------------------------------------

failover_command = ' /opt/pgpool/failover_stream.sh %d %H /tmp/trigger_file0 '

#------------------------------------------------------------------------------
# WATCHDOG
#------------------------------------------------------------------------------

# - Enabling -
use_watchdog = on
# - Watchdog communication Settings -

wd_hostname = 'master'
                                    # Host name or IP address of this watchdog
                                    # (change requires restart)
wd_port = 9000
                                    # port number for watchdog service
                                    # (change requires restart)
# - Virtual IP control Setting -

delegate_IP = ' 192.168.123.183 '
                                    # delegate IP address
                                    # If this is empty, virtual IP never bring up.
                                    # (change requires restart)
if_cmd_path = '/sbin'
                                    # path to the directory where if_up/down_cmd 
                                    # (change requires restart)
if_up_cmd = 'ifconfig eth0:0 inet $_IP_$ netmask 255.255.255.0'
                                    # startup delegate IP command
                                    # (change requires restart)
if_down_cmd = 'ifconfig eth0:0 down'
                                    # shutdown delegate IP command
                                    # (change requires restart)
# -- heartbeat mode --

wd_heartbeat_port = 9694
                                    # Port number for receiving heartbeat signal
                                    # (change requires restart)
wd_heartbeat_keepalive = 2
                                    # Interval time of sending heartbeat signal (sec)
                                    # (change requires restart)
wd_heartbeat_deadtime = 30
                                    # Deadtime interval for heartbeat signal (sec)
                                    # (change requires restart)
heartbeat_destination0 = 'slave1'
                                    # Host name or IP address of destination 0
                                    # for sending heartbeat signal.
                                    # (change requires restart)
heartbeat_destination_port0 = 9694
                                    # Port number of destination 0 for sending
                                    # heartbeat signal. Usually this is the
                                    # same as wd_heartbeat_port.
                                    # (change requires restart)
heartbeat_device0 = 'eth0'
                                    # Name of NIC device (such like 'eth0')
                                    # used for sending/receiving heartbeat
                                    # signal to/from destination 0.
                                    # This works only when this is not empty
                                    # and pgpool has root privilege.
                                    # (change requires restart)
# - Other pgpool Connection Settings -

other_pgpool_hostname0 = 'slave'        #對(duì)端
                                    # Host name or IP address to connect to for 
                                    # (change requires restart)
other_pgpool_port0 = 9999
                                    # Port number for othet pgpool 0
                                    # (change requires restart)
other_wd_port0 = 9000
                                    # Port number for othet watchdog 0
                                    # (change requires restart)


4.4、Slave1的配置:

配置白名單:
要和pg_hba.conf登陸權(quán)限一致泳猬,這里由于是私有云批钠,都用trust
vim /etc/pgpool-II/pool_hba.conf
在最后改成:

配置pcp管理工具密碼:
pg_md5 pwd
密碼加密

vim /etc/pgpool-II/pcp.conf
把剛才加密的密碼粘貼到文件里

配置系統(tǒng)命令權(quán)限:
Root用戶下:
chmod u+s /sbin/ifconfig &&chmod u+s /usr/sbin

配置中間件配置文件:
vim /etc/pgpool-II/pgpool.conf

# CONNECTIONS
listen_addresses = '*'
port = 9999
pcp_listen_addresses = '*'
pcp_port = 9898

# - Backend Connection Settings -

backend_hostname0 = 'master'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = ' /app/pgsql/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'

backend_hostname1 = 'slave1'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/app/pgsql/data '
backend_flag1 = 'ALLOW_TO_FAILOVER'

# - Authentication -
enable_pool_hba = off
pool_passwd = 'pool_passwd'

# FILE LOCATIONS
pid_file_name = '/opt/pgpool/pgpool.pid'

replication_mode = off
load_balance_mode = on
master_slave_mode = on
master_slave_sub_mode = 'stream'

sr_check_period = 5
sr_check_user = 'repuser'
sr_check_password = 'repuser'
sr_check_database = 'postgres'

#------------------------------------------------------------------------------
# HEALTH CHECK 健康檢查
#------------------------------------------------------------------------------

health_check_period = 10 # Health check period
                                   # Disabled (0) by default
health_check_timeout = 20
                                   # Health check timeout
                                   # 0 means no timeout
health_check_user = ' repuser '
                                   # Health check user
health_check_password = ' repuser ' #數(shù)據(jù)庫密碼
                                   # Password for health check user
health_check_database = 'postgres'
#必須設(shè)置,否則primary數(shù)據(jù)庫down了得封,pgpool不知道埋心,不能及時(shí)切換。從庫流復(fù)制還在連接數(shù)據(jù)忙上,報(bào)連接失敗拷呆。
#只有下次使用pgpool登錄時(shí),發(fā)現(xiàn)連接不上疫粥,然后報(bào)錯(cuò)茬斧,這時(shí)候,才知道掛了梗逮,pgpool進(jìn)行切換项秉。


#主備切換的命令行配置
#------------------------------------------------------------------------------
# FAILOVER AND FAILBACK
#------------------------------------------------------------------------------

failover_command = '/opt/pgpool/failover_stream.sh %d %H /tmp/trigger_file0 '

#------------------------------------------------------------------------------
# WATCHDOG
#------------------------------------------------------------------------------

# - Enabling -
use_watchdog = on
# - Watchdog communication Settings -

wd_hostname = 'slave1'  #本端
                                    # Host name or IP address of this watchdog
                                    # (change requires restart)
wd_port = 9000
                                    # port number for watchdog service
                                    # (change requires restart)
# - Virtual IP control Setting -

delegate_IP = '192.168.123.183'
                                    # delegate IP address
                                    # If this is empty, virtual IP never bring up.
                                    # (change requires restart)
if_cmd_path = '/sbin'
                                    # path to the directory where if_up/down_cmd exists
                                    # (change requires restart)
if_up_cmd = 'ifconfig eth0:0 inet $_IP_$ netmask 255.255.255.0'
                                    # startup delegate IP command
                                    # (change requires restart)
if_down_cmd = 'ifconfig eth0:0 down'
                                    # shutdown delegate IP command
                                    # (change requires restart)
# -- heartbeat mode --

wd_heartbeat_port = 9694
                                    # Port number for receiving heartbeat signal
                                    # (change requires restart)
wd_heartbeat_keepalive = 2
                                    # Interval time of sending heartbeat signal (sec)
                                    # (change requires restart)
wd_heartbeat_deadtime = 30
                                    # Deadtime interval for heartbeat signal (sec)
                                    # (change requires restart)
heartbeat_destination0 = 'master'      #對(duì)端
                                    # Host name or IP address of destination 0
                                    # for sending heartbeat signal.
                                    # (change requires restart)
heartbeat_destination_port0 = 9694
                                    # Port number of destination 0 for sending
                                    # heartbeat signal. Usually this is the
                                    # same as wd_heartbeat_port.
                                    # (change requires restart)
heartbeat_device0 = 'eth0'
                                    # Name of NIC device (such like 'eth0')
                                    # used for sending/receiving heartbeat
                                    # signal to/from destination 0.
                                    # This works only when this is not empty
                                    # and pgpool has root privilege.
                                    # (change requires restart)
# - Other pgpool Connection Settings -

other_pgpool_hostname0 = 'master'      #對(duì)端
                                    # Host name or IP address to connect to for 
                                    # (change requires restart)
other_pgpool_port0 = 9999
                                    # Port number for othet pgpool 0
                                    # (change requires restart)
other_wd_port0 = 9000
                                    # Port number for othet watchdog 0
                                    # (change requires restart)


下面在master和slave1這兩臺(tái)機(jī)器上
mkdir /opt/pgpool &&chown postgres:postgres /opt/pgpool

master上:

cd /opt/pgpool
vim failover_stream.sh
# Failover command for streaming replication.
# This script assumes that DB node 0 is primary, and 1 is standby.
#
# If standby goes down, do nothing. If primary goes down, create a
# trigger file so that standby takes over primary node.
#
# Arguments: $1: failed node id. $2: new master hostname. $3: path to
# trigger file.
failed_node=192.168.123.180
new_master=192.168.123.181
trigger_file=$3
# Do nothing if standby goes down.
if [ $failed_node = 1 ]; then
exit 0;
fi
# Create the trigger file.
/usr/bin/ssh -T $new_master /bin/touch $trigger_file
exit 0;


保存退出,并賦權(quán)
chown postgres:postgres failover_stream.sh &&chmod 777 failover_stream.sh

slave1上:

cd /opt/pgpool
vim failover_stream.sh
#! /bin/sh


# Failover command for streaming replication.
# This script assumes that DB node 0 is primary, and 1 is standby.
#
# If standby goes down, do nothing. If primary goes down, create a
# trigger file so that standby takes over primary node.
#
# Arguments: $1: failed node id. $2: new master hostname. $3: path to
# trigger file.
failed_node=192.168.123.181
new_master=192.168.123.180
trigger_file=$3
# Do nothing if standby goes down.
if [ $failed_node = 1 ]; then
exit 0;
fi
# Create the trigger file.
/usr/bin/ssh -T $new_master /bin/touch $trigger_file
exit 0;

保存退出并賦權(quán):
chown postgres:postgres failover_stream.sh &&chmod 777 failover_stream.sh

在master和salve1上創(chuàng)建日志文件:

mkdir /var/log/pgpool
chown -R postgres.postgres /var/log/pgpool
mkdir /var/run/pgpool
chown -R postgres.postgres /var/run/pgpool

配置host:
在master、slave1慷彤、slave2的/etc/hosts配置ip映射

192.168.123.180 master
192.168.123.181 slave1
192.168.123.182 slave2

在master上創(chuàng)建repusr賬號(hào):

su postgres
psql
create user repuser with password 'repuser';

防火墻開放:5432 9999 9898 9000 9694
4.5娄蔼、啟動(dòng)pgpool
先在master上啟動(dòng)pgpool:
pgpool -n -d -D > /var/log/pgpool/pgpool.log 2>&1 &

再在slave1上啟動(dòng)pgpool:
pgpool -n -d -D > /var/log/pgpool/pgpool.log 2>&1 &
Master上的ifconfig會(huì)多一個(gè)虛擬ip出來

快速停止pgpool的指令:
pgpool -m fast stop
連接虛擬ip進(jìn)入數(shù)據(jù)庫:

Su postgres
psql -h 192.168.123.183 -p 9999

查看集群節(jié)點(diǎn)狀態(tài):
show pool_nodes;

寫在安裝后

寫文檔才發(fā)現(xiàn),邊安裝邊趟坑邊記錄底哗,還要注意格式是多么愉(xin)快(ku)的事岁诉,本著開源精神,貼出來給要用到pg集群的小伙伴們參考跋选,本文侵刪

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唉侄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子野建,更是在濱河造成了極大的恐慌,老刑警劉巖恬叹,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件候生,死亡現(xiàn)場離奇詭異,居然都是意外死亡绽昼,警方通過查閱死者的電腦和手機(jī)唯鸭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硅确,“玉大人目溉,你說我怎么就攤上這事。” “怎么了缠借?”我有些...
    開封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵歧譬,是天一觀的道長。 經(jīng)常有香客問我陷猫,道長秫舌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任绣檬,我火速辦了婚禮足陨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘娇未。我一直安慰自己墨缘,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開白布零抬。 她就那樣靜靜地躺著镊讼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪媚值。 梳的紋絲不亂的頭發(fā)上狠毯,一...
    開封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音褥芒,去河邊找鬼嚼松。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锰扶,可吹牛的內(nèi)容都是我干的献酗。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼坷牛,長吁一口氣:“原來是場噩夢啊……” “哼罕偎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起京闰,我...
    開封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤颜及,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蹂楣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體俏站,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年痊土,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了肄扎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖犯祠,靈堂內(nèi)的尸體忽然破棺而出旭等,到底是詐尸還是另有隱情,我是刑警寧澤衡载,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布搔耕,位于F島的核電站,受9級(jí)特大地震影響月劈,放射性物質(zhì)發(fā)生泄漏度迂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一猜揪、第九天 我趴在偏房一處隱蔽的房頂上張望惭墓。 院中可真熱鬧,春花似錦而姐、人聲如沸腊凶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钧萍。三九已至,卻和暖如春政鼠,著一層夾襖步出監(jiān)牢的瞬間风瘦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來泰國打工公般, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留万搔,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓官帘,卻偏偏與公主長得像瞬雹,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刽虹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容