Spaces:
Sleeping
Sleeping
upload github well compiled files
#1
by
NickNYU
- opened
- .gitattributes +35 -0
- .gitignore +0 -1
- .idea/.gitignore +0 -8
- .idea/inspectionProfiles/profiles_settings.xml +0 -6
- .idea/llama-xpipe.iml +0 -11
- .idea/misc.xml +0 -4
- .idea/modules.xml +0 -8
- .idea/vcs.xml +0 -6
- Makefile +1 -1
- README.md +0 -44
- app.py +69 -45
- core/__pycache__/__init__.cpython-310.pyc +0 -0
- core/__pycache__/lifecycle.cpython-310.pyc +0 -0
- core/__pycache__/logger_factory.cpython-310.pyc +0 -0
- core/helper.py +0 -31
- core/lifecycle.py +185 -184
- core/test_lifecycle.py +3 -0
- dataset/docstore.json +0 -1
- dataset/graph_store.json +0 -1
- dataset/index_store.json +0 -1
- dataset/vector_store.json +0 -0
- docs/docs.pkl +0 -0
- github_retriever.py +63 -0
- {langchain_manager → langchain}/__init__.py +0 -0
- {langchain_manager → langchain}/manager.py +6 -37
- llama/context.py +61 -0
- llama/data_loader.py +4 -3
- llama/index.py +18 -0
- llama/service_context.py +0 -142
- llama/storage_context.py +0 -67
- llama/utils.py +0 -5
- llama/vector_storage.py +18 -0
- local-requirements.txt +0 -1
- pyproject.toml +2 -1
- requirements.txt +7 -10
- xpipe_wiki/__init__.py +0 -0
- xpipe_wiki/manager_factory.py +0 -82
- xpipe_wiki/robot_manager.py +0 -79
.gitattributes
ADDED
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
*.7z filter=lfs diff=lfs merge=lfs -text
|
2 |
+
*.arrow filter=lfs diff=lfs merge=lfs -text
|
3 |
+
*.bin filter=lfs diff=lfs merge=lfs -text
|
4 |
+
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
5 |
+
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
6 |
+
*.ftz filter=lfs diff=lfs merge=lfs -text
|
7 |
+
*.gz filter=lfs diff=lfs merge=lfs -text
|
8 |
+
*.h5 filter=lfs diff=lfs merge=lfs -text
|
9 |
+
*.joblib filter=lfs diff=lfs merge=lfs -text
|
10 |
+
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
11 |
+
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
12 |
+
*.model filter=lfs diff=lfs merge=lfs -text
|
13 |
+
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
14 |
+
*.npy filter=lfs diff=lfs merge=lfs -text
|
15 |
+
*.npz filter=lfs diff=lfs merge=lfs -text
|
16 |
+
*.onnx filter=lfs diff=lfs merge=lfs -text
|
17 |
+
*.ot filter=lfs diff=lfs merge=lfs -text
|
18 |
+
*.parquet filter=lfs diff=lfs merge=lfs -text
|
19 |
+
*.pb filter=lfs diff=lfs merge=lfs -text
|
20 |
+
*.pickle filter=lfs diff=lfs merge=lfs -text
|
21 |
+
*.pkl filter=lfs diff=lfs merge=lfs -text
|
22 |
+
*.pt filter=lfs diff=lfs merge=lfs -text
|
23 |
+
*.pth filter=lfs diff=lfs merge=lfs -text
|
24 |
+
*.rar filter=lfs diff=lfs merge=lfs -text
|
25 |
+
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
26 |
+
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
27 |
+
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
28 |
+
*.tar filter=lfs diff=lfs merge=lfs -text
|
29 |
+
*.tflite filter=lfs diff=lfs merge=lfs -text
|
30 |
+
*.tgz filter=lfs diff=lfs merge=lfs -text
|
31 |
+
*.wasm filter=lfs diff=lfs merge=lfs -text
|
32 |
+
*.xz filter=lfs diff=lfs merge=lfs -text
|
33 |
+
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
+
*.zst filter=lfs diff=lfs merge=lfs -text
|
35 |
+
*tfevents* filter=lfs diff=lfs merge=lfs -text
|
.gitignore
CHANGED
@@ -56,7 +56,6 @@ coverage.xml
|
|
56 |
.hypothesis/
|
57 |
.pytest_cache/
|
58 |
.ruff_cache
|
59 |
-
wandb/
|
60 |
|
61 |
# Translations
|
62 |
*.mo
|
|
|
56 |
.hypothesis/
|
57 |
.pytest_cache/
|
58 |
.ruff_cache
|
|
|
59 |
|
60 |
# Translations
|
61 |
*.mo
|
.idea/.gitignore
DELETED
@@ -1,8 +0,0 @@
|
|
1 |
-
# Default ignored files
|
2 |
-
/shelf/
|
3 |
-
/workspace.xml
|
4 |
-
# Editor-based HTTP Client requests
|
5 |
-
/httpRequests/
|
6 |
-
# Datasource local storage ignored files
|
7 |
-
/dataSources/
|
8 |
-
/dataSources.local.xml
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.idea/inspectionProfiles/profiles_settings.xml
DELETED
@@ -1,6 +0,0 @@
|
|
1 |
-
<component name="InspectionProjectProfileManager">
|
2 |
-
<settings>
|
3 |
-
<option name="USE_PROJECT_PROFILE" value="false" />
|
4 |
-
<version value="1.0" />
|
5 |
-
</settings>
|
6 |
-
</component>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.idea/llama-xpipe.iml
DELETED
@@ -1,11 +0,0 @@
|
|
1 |
-
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
-
<module type="PYTHON_MODULE" version="4">
|
3 |
-
<component name="NewModuleRootManager">
|
4 |
-
<content url="file://$MODULE_DIR$">
|
5 |
-
<excludeFolder url="file://$MODULE_DIR$/.venv" />
|
6 |
-
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
7 |
-
</content>
|
8 |
-
<orderEntry type="inheritedJdk" />
|
9 |
-
<orderEntry type="sourceFolder" forTests="false" />
|
10 |
-
</component>
|
11 |
-
</module>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.idea/misc.xml
DELETED
@@ -1,4 +0,0 @@
|
|
1 |
-
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
-
<project version="4">
|
3 |
-
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (llama-xpipe)" project-jdk-type="Python SDK" />
|
4 |
-
</project>
|
|
|
|
|
|
|
|
|
|
.idea/modules.xml
DELETED
@@ -1,8 +0,0 @@
|
|
1 |
-
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
-
<project version="4">
|
3 |
-
<component name="ProjectModuleManager">
|
4 |
-
<modules>
|
5 |
-
<module fileurl="file://$PROJECT_DIR$/.idea/llama-xpipe.iml" filepath="$PROJECT_DIR$/.idea/llama-xpipe.iml" />
|
6 |
-
</modules>
|
7 |
-
</component>
|
8 |
-
</project>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.idea/vcs.xml
DELETED
@@ -1,6 +0,0 @@
|
|
1 |
-
<?xml version="1.0" encoding="UTF-8"?>
|
2 |
-
<project version="4">
|
3 |
-
<component name="VcsDirectoryMappings">
|
4 |
-
<mapping directory="" vcs="Git" />
|
5 |
-
</component>
|
6 |
-
</project>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Makefile
CHANGED
@@ -8,7 +8,7 @@ format:
|
|
8 |
lint:
|
9 |
mypy .
|
10 |
black . --check
|
11 |
-
ruff check .
|
12 |
|
13 |
test:
|
14 |
pytest tests
|
|
|
8 |
lint:
|
9 |
mypy .
|
10 |
black . --check
|
11 |
+
ruff check .
|
12 |
|
13 |
test:
|
14 |
pytest tests
|
README.md
CHANGED
@@ -11,47 +11,3 @@ license: apache-2.0
|
|
11 |
---
|
12 |
|
13 |
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
14 |
-
|
15 |
-
Then, create a new Python virtual environment. The command below creates an environment in `.venv`,
|
16 |
-
and activates it:
|
17 |
-
|
18 |
-
```bash
|
19 |
-
python -m venv .venv
|
20 |
-
source .venv/bin/activate
|
21 |
-
```
|
22 |
-
|
23 |
-
if you are in windows, use the following to activate your virtual environment:
|
24 |
-
|
25 |
-
```bash
|
26 |
-
.venv\scripts\activate
|
27 |
-
```
|
28 |
-
|
29 |
-
Install the required dependencies (this will also install gpt-index through `pip install -e .`
|
30 |
-
so that you can start developing on it):
|
31 |
-
|
32 |
-
```bash
|
33 |
-
pip install -r requirements.txt
|
34 |
-
```
|
35 |
-
|
36 |
-
Now you should be set!
|
37 |
-
|
38 |
-
### Validating your Change
|
39 |
-
|
40 |
-
Let's make sure to `format/lint` our change. For bigger changes,
|
41 |
-
let's also make sure to `test` it and perhaps create an `example notebook`.
|
42 |
-
|
43 |
-
#### Formatting/Linting
|
44 |
-
|
45 |
-
You can format and lint your changes with the following commands in the root directory:
|
46 |
-
|
47 |
-
```bash
|
48 |
-
make format; make lint
|
49 |
-
```
|
50 |
-
|
51 |
-
You can also make use of our pre-commit hooks by setting up git hook scripts:
|
52 |
-
|
53 |
-
```bash
|
54 |
-
pre-commit install
|
55 |
-
```
|
56 |
-
|
57 |
-
We run an assortment of linters: `black`, `ruff`, `mypy`.
|
|
|
11 |
---
|
12 |
|
13 |
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
app.py
CHANGED
@@ -1,45 +1,69 @@
|
|
1 |
-
import
|
2 |
-
import
|
3 |
-
|
4 |
-
import
|
5 |
-
from
|
6 |
-
|
7 |
-
from
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
)
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
from llama_index import SimpleDirectoryReader
|
3 |
+
from llama_index.node_parser import SimpleNodeParser
|
4 |
+
from llama_index.data_structs.node import Node, DocumentRelationship
|
5 |
+
from llama_index import VectorStoreIndex
|
6 |
+
from llama_index import LLMPredictor, VectorStoreIndex, ServiceContext
|
7 |
+
from langchain.llms import AzureOpenAI
|
8 |
+
from langchain.embeddings.openai import OpenAIEmbeddings
|
9 |
+
from llama_index import LangchainEmbedding, ServiceContext
|
10 |
+
from llama_index import StorageContext, load_index_from_storage
|
11 |
+
|
12 |
+
import logging
|
13 |
+
import sys
|
14 |
+
|
15 |
+
|
16 |
+
logging.basicConfig(
|
17 |
+
stream=sys.stdout, level=logging.DEBUG
|
18 |
+
) # logging.DEBUG for more verbose output
|
19 |
+
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
|
20 |
+
|
21 |
+
|
22 |
+
def main() -> None:
|
23 |
+
documents = SimpleDirectoryReader("./data").load_data()
|
24 |
+
|
25 |
+
# index = VectorStoreIndex.from_documents(documents)
|
26 |
+
|
27 |
+
# parser = SimpleNodeParser()
|
28 |
+
# nodes = parser.get_nodes_from_documents(documents)
|
29 |
+
# index = VectorStoreIndex(nodes)
|
30 |
+
|
31 |
+
# define embedding
|
32 |
+
embedding = LangchainEmbedding(OpenAIEmbeddings(client=None, chunk_size=1))
|
33 |
+
# define LLM
|
34 |
+
llm_predictor = LLMPredictor(
|
35 |
+
llm=AzureOpenAI(
|
36 |
+
client=None,
|
37 |
+
deployment_name="text-davinci-003",
|
38 |
+
model="text-davinci-003",
|
39 |
+
)
|
40 |
+
)
|
41 |
+
|
42 |
+
# configure service context
|
43 |
+
service_context = ServiceContext.from_defaults(
|
44 |
+
llm_predictor=llm_predictor, embed_model=embedding
|
45 |
+
)
|
46 |
+
|
47 |
+
# build index
|
48 |
+
index = VectorStoreIndex.from_documents(
|
49 |
+
documents,
|
50 |
+
service_context=service_context,
|
51 |
+
)
|
52 |
+
|
53 |
+
index.storage_context.persist(persist_dir="./dataset")
|
54 |
+
storage_context = StorageContext.from_defaults(persist_dir="./dataset")
|
55 |
+
index = load_index_from_storage(
|
56 |
+
storage_context=storage_context, service_context=service_context
|
57 |
+
)
|
58 |
+
|
59 |
+
# index.vector_store.persist("./dataset")
|
60 |
+
# query with embed_model specified
|
61 |
+
query_engine = index.as_query_engine(
|
62 |
+
retriever_mode="embedding", verbose=True, service_context=service_context
|
63 |
+
)
|
64 |
+
response = query_engine.query("请帮忙推荐一杯咖啡给我,我喜欢咖啡因")
|
65 |
+
print(response)
|
66 |
+
|
67 |
+
|
68 |
+
if __name__ == "__main__":
|
69 |
+
main()
|
core/__pycache__/__init__.cpython-310.pyc
CHANGED
Binary files a/core/__pycache__/__init__.cpython-310.pyc and b/core/__pycache__/__init__.cpython-310.pyc differ
|
|
core/__pycache__/lifecycle.cpython-310.pyc
CHANGED
Binary files a/core/__pycache__/lifecycle.cpython-310.pyc and b/core/__pycache__/lifecycle.cpython-310.pyc differ
|
|
core/__pycache__/logger_factory.cpython-310.pyc
CHANGED
Binary files a/core/__pycache__/logger_factory.cpython-310.pyc and b/core/__pycache__/logger_factory.cpython-310.pyc differ
|
|
core/helper.py
DELETED
@@ -1,31 +0,0 @@
|
|
1 |
-
from core.lifecycle import Lifecycle
|
2 |
-
|
3 |
-
|
4 |
-
class LifecycleHelper:
|
5 |
-
@classmethod
|
6 |
-
def initialize_if_possible(cls, ls: Lifecycle) -> None:
|
7 |
-
if isinstance(ls, Lifecycle) and ls.lifecycle_state.can_initialize(
|
8 |
-
ls.lifecycle_state.phase
|
9 |
-
):
|
10 |
-
ls.initialize()
|
11 |
-
|
12 |
-
@classmethod
|
13 |
-
def start_if_possible(cls, ls: Lifecycle) -> None:
|
14 |
-
if isinstance(ls, Lifecycle) and ls.lifecycle_state.can_start(
|
15 |
-
ls.lifecycle_state.phase
|
16 |
-
):
|
17 |
-
ls.start()
|
18 |
-
|
19 |
-
@classmethod
|
20 |
-
def stop_if_possible(cls, ls: Lifecycle) -> None:
|
21 |
-
if isinstance(ls, Lifecycle) and ls.lifecycle_state.can_stop(
|
22 |
-
ls.lifecycle_state.phase
|
23 |
-
):
|
24 |
-
ls.stop()
|
25 |
-
|
26 |
-
@classmethod
|
27 |
-
def dispose_if_possible(cls, ls: Lifecycle) -> None:
|
28 |
-
if isinstance(ls, Lifecycle) and ls.lifecycle_state.can_dispose(
|
29 |
-
ls.lifecycle_state.phase
|
30 |
-
):
|
31 |
-
ls.dispose()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
core/lifecycle.py
CHANGED
@@ -1,184 +1,185 @@
|
|
1 |
-
import enum
|
2 |
-
from abc import ABC, abstractmethod
|
3 |
-
from typing import TypeVar, Optional
|
4 |
-
|
5 |
-
from core import logger_factory
|
6 |
-
|
7 |
-
|
8 |
-
class Initializable(ABC):
|
9 |
-
@abstractmethod
|
10 |
-
def initialize(self) -> None:
|
11 |
-
pass
|
12 |
-
|
13 |
-
|
14 |
-
class Startable(ABC):
|
15 |
-
@abstractmethod
|
16 |
-
def start(self) -> None:
|
17 |
-
pass
|
18 |
-
|
19 |
-
|
20 |
-
class Stoppable(ABC):
|
21 |
-
@abstractmethod
|
22 |
-
def stop(self) -> None:
|
23 |
-
pass
|
24 |
-
|
25 |
-
|
26 |
-
class Disposable(ABC):
|
27 |
-
@abstractmethod
|
28 |
-
def dispose(self) -> None:
|
29 |
-
pass
|
30 |
-
|
31 |
-
|
32 |
-
class LifecycleAware(ABC):
|
33 |
-
def __init__(self, state: "LifecycleState") -> None:
|
34 |
-
"""
|
35 |
-
Args:
|
36 |
-
state(LifecycleState): lifecycle state
|
37 |
-
"""
|
38 |
-
self.state = state
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
self.
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
self.
|
55 |
-
self.
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
self.
|
63 |
-
self.
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
self.
|
71 |
-
self.
|
72 |
-
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
self.
|
79 |
-
self.
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
self.
|
136 |
-
self.
|
137 |
-
self.
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
self.
|
|
|
|
1 |
+
import enum
|
2 |
+
from abc import ABC, abstractmethod
|
3 |
+
from typing import TypeVar, Optional
|
4 |
+
|
5 |
+
from core import logger_factory
|
6 |
+
|
7 |
+
|
8 |
+
class Initializable(ABC):
|
9 |
+
@abstractmethod
|
10 |
+
def initialize(self) -> None:
|
11 |
+
pass
|
12 |
+
|
13 |
+
|
14 |
+
class Startable(ABC):
|
15 |
+
@abstractmethod
|
16 |
+
def start(self) -> None:
|
17 |
+
pass
|
18 |
+
|
19 |
+
|
20 |
+
class Stoppable(ABC):
|
21 |
+
@abstractmethod
|
22 |
+
def stop(self) -> None:
|
23 |
+
pass
|
24 |
+
|
25 |
+
|
26 |
+
class Disposable(ABC):
|
27 |
+
@abstractmethod
|
28 |
+
def dispose(self) -> None:
|
29 |
+
pass
|
30 |
+
|
31 |
+
|
32 |
+
class LifecycleAware(ABC):
|
33 |
+
def __init__(self, state: "LifecycleState") -> None:
|
34 |
+
"""
|
35 |
+
Args:
|
36 |
+
state(LifecycleState): lifecycle state
|
37 |
+
"""
|
38 |
+
self.state = state
|
39 |
+
|
40 |
+
@property
|
41 |
+
def get_lifecycle_state(self) -> "LifecycleState":
|
42 |
+
return self.state
|
43 |
+
|
44 |
+
|
45 |
+
class Lifecycle(Initializable, Startable, Stoppable, Disposable, LifecycleAware, ABC):
|
46 |
+
def __init__(self) -> None:
|
47 |
+
self.logger = logger_factory.get_logger(self.__class__.__name__)
|
48 |
+
self.lifecycle_state = LifecycleState(lifecycle=self)
|
49 |
+
|
50 |
+
def initialize(self) -> None:
|
51 |
+
if not self.lifecycle_state.can_initialize(self.lifecycle_state.get_phase()):
|
52 |
+
self.logger.warning("[{}]cannot initialize".format(self.__class__.__name__))
|
53 |
+
return
|
54 |
+
self.lifecycle_state.set_phase(LifecyclePhase.INITIALIZING)
|
55 |
+
self.do_init()
|
56 |
+
self.lifecycle_state.set_phase(LifecyclePhase.INITIALIZED)
|
57 |
+
|
58 |
+
def start(self) -> None:
|
59 |
+
if not self.lifecycle_state.can_start(self.lifecycle_state.get_phase()):
|
60 |
+
self.logger.warning("[{}]cannot start".format(self.__class__.__name__))
|
61 |
+
return
|
62 |
+
self.lifecycle_state.set_phase(LifecyclePhase.STARTING)
|
63 |
+
self.do_start()
|
64 |
+
self.lifecycle_state.set_phase(LifecyclePhase.STARTED)
|
65 |
+
|
66 |
+
def stop(self) -> None:
|
67 |
+
if not self.lifecycle_state.can_stop(self.lifecycle_state.get_phase()):
|
68 |
+
self.logger.warning("[{}]cannot stop".format(self.__class__.__name__))
|
69 |
+
return
|
70 |
+
self.lifecycle_state.set_phase(LifecyclePhase.STOPPING)
|
71 |
+
self.do_stop()
|
72 |
+
self.lifecycle_state.set_phase(LifecyclePhase.STOPPED)
|
73 |
+
|
74 |
+
def dispose(self) -> None:
|
75 |
+
if not self.lifecycle_state.can_dispose(self.lifecycle_state.get_phase()):
|
76 |
+
self.logger.warning("[{}]cannot dispose".format(self.__class__.__name__))
|
77 |
+
return
|
78 |
+
self.lifecycle_state.set_phase(LifecyclePhase.DISPOSING)
|
79 |
+
self.do_dispose()
|
80 |
+
self.lifecycle_state.set_phase(LifecyclePhase.DISPOSED)
|
81 |
+
|
82 |
+
@abstractmethod
|
83 |
+
def do_init(self) -> None:
|
84 |
+
pass
|
85 |
+
|
86 |
+
@abstractmethod
|
87 |
+
def do_start(self) -> None:
|
88 |
+
pass
|
89 |
+
|
90 |
+
@abstractmethod
|
91 |
+
def do_stop(self) -> None:
|
92 |
+
pass
|
93 |
+
|
94 |
+
@abstractmethod
|
95 |
+
def do_dispose(self) -> None:
|
96 |
+
pass
|
97 |
+
|
98 |
+
|
99 |
+
class LifecyclePhase(enum.Enum):
|
100 |
+
INITIALIZING = 1
|
101 |
+
INITIALIZED = 2
|
102 |
+
STARTING = 3
|
103 |
+
STARTED = 4
|
104 |
+
STOPPING = 5
|
105 |
+
STOPPED = 6
|
106 |
+
DISPOSING = 7
|
107 |
+
DISPOSED = 8
|
108 |
+
|
109 |
+
|
110 |
+
class LifecycleController(ABC):
|
111 |
+
def can_initialize(self, phase: Optional[LifecyclePhase]) -> bool:
|
112 |
+
return phase is None or phase == LifecyclePhase.DISPOSED
|
113 |
+
|
114 |
+
def can_start(self, phase: Optional[LifecyclePhase]) -> bool:
|
115 |
+
return phase is not None and (
|
116 |
+
phase == LifecyclePhase.INITIALIZED or phase == LifecyclePhase.STOPPED
|
117 |
+
)
|
118 |
+
|
119 |
+
def can_stop(self, phase: Optional[LifecyclePhase]) -> bool:
|
120 |
+
return phase is not None and phase == LifecyclePhase.STARTED
|
121 |
+
|
122 |
+
def can_dispose(self, phase: Optional[LifecyclePhase]) -> bool:
|
123 |
+
return phase is not None and (
|
124 |
+
phase == LifecyclePhase.INITIALIZED or phase == LifecyclePhase.STOPPED
|
125 |
+
)
|
126 |
+
|
127 |
+
|
128 |
+
LS = TypeVar("LS", bound=Lifecycle)
|
129 |
+
|
130 |
+
|
131 |
+
class LifecycleState(LifecycleController, ABC):
|
132 |
+
phase: Optional[LifecyclePhase]
|
133 |
+
|
134 |
+
def __init__(self, lifecycle: LS) -> None:
|
135 |
+
self.phase = None
|
136 |
+
self.prev_phase = None
|
137 |
+
self.lifecycle = lifecycle
|
138 |
+
self.logger = logger_factory.get_logger(__name__)
|
139 |
+
|
140 |
+
def is_initializing(self) -> bool:
|
141 |
+
return self.phase == LifecyclePhase.INITIALIZING
|
142 |
+
|
143 |
+
def is_initialized(self) -> bool:
|
144 |
+
return self.phase == LifecyclePhase.INITIALIZED
|
145 |
+
|
146 |
+
def is_starting(self) -> bool:
|
147 |
+
return self.phase == LifecyclePhase.STARTING
|
148 |
+
|
149 |
+
def is_started(self) -> bool:
|
150 |
+
return self.phase == LifecyclePhase.STARTED
|
151 |
+
|
152 |
+
def is_stopping(self) -> bool:
|
153 |
+
return self.phase == LifecyclePhase.STOPPING
|
154 |
+
|
155 |
+
def is_stopped(self) -> bool:
|
156 |
+
return self.phase == LifecyclePhase.STOPPED
|
157 |
+
|
158 |
+
def is_disposing(self) -> bool:
|
159 |
+
return self.phase == LifecyclePhase.DISPOSING
|
160 |
+
|
161 |
+
def is_disposed(self) -> bool:
|
162 |
+
return self.phase == LifecyclePhase.DISPOSED
|
163 |
+
|
164 |
+
def get_phase(self) -> Optional[LifecyclePhase]:
|
165 |
+
return self.phase
|
166 |
+
|
167 |
+
def set_phase(self, phase: Optional[LifecyclePhase]) -> None:
|
168 |
+
prev = "None"
|
169 |
+
if self.phase is not None:
|
170 |
+
prev = self.phase.name
|
171 |
+
current = "None"
|
172 |
+
if phase is not None:
|
173 |
+
current = phase.name
|
174 |
+
self.logger.info(
|
175 |
+
"[setPhaseName][{}]{} --> {}".format(
|
176 |
+
self.lifecycle.__class__.__name__,
|
177 |
+
prev,
|
178 |
+
current,
|
179 |
+
)
|
180 |
+
)
|
181 |
+
self.phase = phase
|
182 |
+
|
183 |
+
def rollback(self, err: Exception) -> None:
|
184 |
+
self.phase = self.prev_phase
|
185 |
+
self.prev_phase = None
|
core/test_lifecycle.py
CHANGED
@@ -1,7 +1,10 @@
|
|
|
|
1 |
from unittest import TestCase
|
2 |
|
3 |
from core.lifecycle import Lifecycle
|
4 |
|
|
|
|
|
5 |
|
6 |
class SubLifecycle(Lifecycle):
|
7 |
def __init__(self) -> None:
|
|
|
1 |
+
import logging
|
2 |
from unittest import TestCase
|
3 |
|
4 |
from core.lifecycle import Lifecycle
|
5 |
|
6 |
+
logging.basicConfig()
|
7 |
+
|
8 |
|
9 |
class SubLifecycle(Lifecycle):
|
10 |
def __init__(self) -> None:
|
dataset/docstore.json
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
{"docstore/metadata": {"59c5fcb6fbc3fb59706aa803f8303063eecb5f6a": {"doc_hash": "6e11b31ab4caa0c2aefc2e8a9f88aca0c5531e77966f6f207de69ad3782b56b8"}, "87c0a0a03885d1a2f92dd7da09b59a216fe18d1a": {"doc_hash": "bb214e11e1b02a9fb1f429b83c8dc486e2e6deb2a28d1fafc043b1fe9d8a7d6e"}, "f4e8dea3f4206b83d5a2b728be75904de53a24b5": {"doc_hash": "9236fa38cf55110fd60d352fbd1660cad271eb90594f2e59d543c1501a7ef9f6"}, "be00460586568a7bdf45d1a4c4df15e223068fd5": {"doc_hash": "e07cb5a5f3c5c046c3fb5c0b49f61a84bbba4e37a5e42407f38de30946441f6d"}, "231924dc75127b769db8454825b9599100070419": {"doc_hash": "aefd12bff580e02247cec85619b34958ec61ed4ae2ccd643bdc043ae023147e6"}, "ab72ca168649fc7fbb292dec7495bbeeabde0407": {"doc_hash": "1c2369a0201a510f5662de686af2c9ddf680e808c92373537bd4ed1d5b456aa5"}, "350021a40b38746aea78dcf46408053627cc6997": {"doc_hash": "21def68593118d303535d4356f280567a25866f75580e596984934f59cf1c59f"}, "4fdc8892ee752699cbd6e4d4d5f395dfdbcd06eb": {"doc_hash": "009ed108948af65b95349521e4d096cf73a0ec2838e00c779a2d4f4011404261"}, "f41ad767777f1af3dbd531eb9ee98ead716942a5": {"doc_hash": "5f62340bff002103b484740f1f77f7eb1a3f7395e589432209a9f9d19e7e97c2"}, "ba41983c476af94547f89d0d3cc420e73f90c9f4": {"doc_hash": "ee1a39527e8a6688288ac04bcd0485b4a225947095b37da81f46408d3c38569f"}, "59108663-a5e1-4e3e-bb21-626158eef136": {"doc_hash": "cffc9b3c8750b8caccc8c0efbb06e20e97c2e633a5f3bedb8720fbc4bbdfcd35", "ref_doc_id": "59c5fcb6fbc3fb59706aa803f8303063eecb5f6a"}, "50de4ec9-febb-466f-9f9a-cc9296895e83": {"doc_hash": "4648b816b18a48db2a4029cb99429f9ad15b94a399e1f45d6215ed7c07a0ecd9", "ref_doc_id": "59c5fcb6fbc3fb59706aa803f8303063eecb5f6a"}, "aa413a53-0dda-4ac4-8ae9-6e8e340bb4f0": {"doc_hash": "884969d8e53318419927356553e5c968b2ede10792819629a8798a45e6917b00", "ref_doc_id": "59c5fcb6fbc3fb59706aa803f8303063eecb5f6a"}, "a0cc4323-ec8f-4fed-9401-e44125134341": {"doc_hash": "bb214e11e1b02a9fb1f429b83c8dc486e2e6deb2a28d1fafc043b1fe9d8a7d6e", "ref_doc_id": "87c0a0a03885d1a2f92dd7da09b59a216fe18d1a"}, "5321cc7b-2a86-48b8-b56c-415dde7c149b": {"doc_hash": "0e4be7ab299750b53b82bc29baa6e2d2ed0ca5210dbc0bc767303ec563f80731", "ref_doc_id": "f4e8dea3f4206b83d5a2b728be75904de53a24b5"}, "9e19fb91-8258-4aca-9692-2d027073499e": {"doc_hash": "e07cb5a5f3c5c046c3fb5c0b49f61a84bbba4e37a5e42407f38de30946441f6d", "ref_doc_id": "be00460586568a7bdf45d1a4c4df15e223068fd5"}, "02e856e5-4211-4a27-9204-e966907f1d74": {"doc_hash": "ead3a339428fdfde5e3cc7d563b043defb2a7fc6cf5e924ba5a45a527181bc50", "ref_doc_id": "231924dc75127b769db8454825b9599100070419"}, "f3074870-8fbf-4322-b1d2-2111e6aac9af": {"doc_hash": "f14507d73b79a1202a84507aa0d5dad3496385f802dc103928f2e970b0dc05b7", "ref_doc_id": "231924dc75127b769db8454825b9599100070419"}, "82677fb9-abe3-4038-8263-5576c47da4f2": {"doc_hash": "5837e5fc5c8a4954fdf7bf44d91c9a26faf4587a0f0857ccbf1bec7186bec5de", "ref_doc_id": "231924dc75127b769db8454825b9599100070419"}, "a08364a6-c23d-4df5-8b5d-84137fbebd4e": {"doc_hash": "cf0cbb478084c17c458c0876dec7577ca7093be1e2935cccf4806a630b673388", "ref_doc_id": "ab72ca168649fc7fbb292dec7495bbeeabde0407"}, "e45b082d-c3ec-45aa-b630-6db49a62728b": {"doc_hash": "90958041cd874f96869bcb7304c5f4f0204e996c69880a7b18f1610dfdc969e9", "ref_doc_id": "ab72ca168649fc7fbb292dec7495bbeeabde0407"}, "2c55445c-04b1-4705-9871-adaa02f38f1b": {"doc_hash": "843c6e38a5250eb4d83a0645ac743953c9b342fc19b4c255b5c2aaf2a74eade3", "ref_doc_id": "ab72ca168649fc7fbb292dec7495bbeeabde0407"}, "d0de9736-ccad-450e-b4a1-49d4cdb8b941": {"doc_hash": "21def68593118d303535d4356f280567a25866f75580e596984934f59cf1c59f", "ref_doc_id": "350021a40b38746aea78dcf46408053627cc6997"}, "fd0d2375-39e2-4bce-8e39-1182a122a1b4": {"doc_hash": "009ed108948af65b95349521e4d096cf73a0ec2838e00c779a2d4f4011404261", "ref_doc_id": "4fdc8892ee752699cbd6e4d4d5f395dfdbcd06eb"}, "13221de7-6c68-4367-b1be-f35b06fc3a74": {"doc_hash": "9b7fb2ce526aee97b401a041522ea93ee4de403abd843dd8c53d67e4ccc56940", "ref_doc_id": "f41ad767777f1af3dbd531eb9ee98ead716942a5"}, "9f448401-cda9-4b5f-9a80-c79e111f9963": {"doc_hash": "b0946d21f3e36bf5af5d142e4e0b39e0f18bb3dfdab97906c3becd49ba7cc1a2", "ref_doc_id": "f41ad767777f1af3dbd531eb9ee98ead716942a5"}, "3bc7dfc2-3ddf-4384-a60c-6cd52e1314f4": {"doc_hash": "90115a8077eec7148edb40e75dd2791ecf2e5aa26c9fbc405feba29045c988e9", "ref_doc_id": "f41ad767777f1af3dbd531eb9ee98ead716942a5"}, "ce3e530c-ce2d-4f5f-a171-72a790c3c624": {"doc_hash": "66c9129880cbf5fdf11f034c4fa1158581f12162d984889f75290fe68d1cbd35", "ref_doc_id": "ba41983c476af94547f89d0d3cc420e73f90c9f4"}, "85f764bd-e560-48ba-a51e-2287b6fe19db": {"doc_hash": "a7a8b4ca2b088d52b7e4f4d9c722f7779ce034c1a1a34e1499dda57a76f058f8", "ref_doc_id": "ba41983c476af94547f89d0d3cc420e73f90c9f4"}, "3a8e4c7c-9f7d-4735-93e7-9d847cff98de": {"doc_hash": "5d29ed1e9b917ef331ae837a77dc4b37c9d74e35907d534dc09b96bb70c8a83f", "ref_doc_id": "ba41983c476af94547f89d0d3cc420e73f90c9f4"}, "af881b61-03f4-4851-8946-794015e3436c": {"doc_hash": "4a978c55891b04b732b10b771b7ea05b85f66025767ea4fd39b1fdf9887c315b", "ref_doc_id": "ba41983c476af94547f89d0d3cc420e73f90c9f4"}, "31579820-439e-4029-b8c4-a0d6528daa59": {"doc_hash": "3a655b7e1aa51b85fba8005ad63ade295e0e7ef9684b2b33825cb79f37a230d6", "ref_doc_id": "ba41983c476af94547f89d0d3cc420e73f90c9f4"}}, "docstore/data": {"59108663-a5e1-4e3e-bb21-626158eef136": {"__data__": {"id_": "59108663-a5e1-4e3e-bb21-626158eef136", "embedding": null, "metadata": {"file_path": "doc/design.md", "file_name": "design.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "59c5fcb6fbc3fb59706aa803f8303063eecb5f6a", "node_type": null, "metadata": {"file_path": "doc/design.md", "file_name": "design.md"}, "hash": "6e11b31ab4caa0c2aefc2e8a9f88aca0c5531e77966f6f207de69ad3782b56b8"}, "3": {"node_id": "50de4ec9-febb-466f-9f9a-cc9296895e83", "node_type": null, "metadata": {"file_path": "doc/design.md", "file_name": "design.md"}, "hash": "4648b816b18a48db2a4029cb99429f9ad15b94a399e1f45d6215ed7c07a0ecd9"}}, "hash": "cffc9b3c8750b8caccc8c0efbb06e20e97c2e633a5f3bedb8720fbc4bbdfcd35", "text": "<!-- MarkdownTOC -->\n\n1. [\u603b\u4f53\u8bbe\u8ba1](#\u603b\u4f53\u8bbe\u8ba1)\n 1. [\u8bbe\u8ba1\u539f\u5219](#\u8bbe\u8ba1\u539f\u5219)\n 1. [\u603b\u4f53\u8bbe\u8ba1\u56fe](#\u603b\u4f53\u8bbe\u8ba1\u56fe)\n 1. [\u673a\u623f\u4e4b\u95f4\u4ea4\u4e92](#\u673a\u623f\u4e4b\u95f4\u4ea4\u4e92)\n 1. [\u673a\u623f\u5185\u4ea4\u4e92](#\u673a\u623f\u5185\u4ea4\u4e92)\n1. [console](#console)\n 1. [db\u5b58\u50a8](#db\u5b58\u50a8)\n1. [zk](#zk)\n 1. [zk\u63d0\u4f9b\u529f\u80fd](#zk\u63d0\u4f9b\u529f\u80fd)\n1. [meta server](#meta-server)\n 1. [meta server\u4e92\u76f8\u901a\u77e5](#meta-server\u4e92\u76f8\u901a\u77e5)\n 1. [\u529f\u80fd](#\u529f\u80fd)\n 1. [\u89d2\u8272](#\u89d2\u8272)\n 1. [\u4efb\u52a1\u5212\u5206](#\u4efb\u52a1\u5212\u5206)\n 1. [master/slave](#masterslave)\n 1. [\u4efb\u52a1\u6267\u884c](#\u4efb\u52a1\u6267\u884c)\n 1. [API](#api)\n 1. [\u72b6\u6001\u67e5\u8be2](#\u72b6\u6001\u67e5\u8be2)\n1. [keeper](#keeper)\n 1. [keeper\u72b6\u6001\u53d8\u5316](#keeper\u72b6\u6001\u53d8\u5316)\n 1. [\u547d\u4ee4](#\u547d\u4ee4)\n\n<!-- /MarkdownTOC -->\n\n<a name=\"\u603b\u4f53\u8bbe\u8ba1\"></a>\n# \u603b\u4f53\u8bbe\u8ba1\n<a name=\"\u8bbe\u8ba1\u539f\u5219\"></a>\n## \u8bbe\u8ba1\u539f\u5219\n1. \u673a\u623f\u901a\u4fe1\u5f02\u5e38\uff0c\u5355\u673a\u623f\u5185\u53ef\u4ee5\u6b63\u5e38\u5de5\u4f5c\n1. \n<a name=\"\u603b\u4f53\u8bbe\u8ba1\u56fe\"></a>\n## \u603b\u4f53\u8bbe\u8ba1\u56fe\n<a name=\"\u673a\u623f\u4e4b\u95f4\u4ea4\u4e92\"></a>\n## \u673a\u623f\u4e4b\u95f4\u4ea4\u4e92\n1. \u7528\u6237\u914d\u7f6e\u4e0b\u53d1\u6267\u884c \n * keeper\u589e\u52a0\u3001\u5220\u9664\u3001\u542f\u52a8\u3001\u505c\u6b62\n * event\u5199\u5230zookeeper\n * meta server\u76d1\u542cevent\uff0c\u6267\u884c\n1. \u624b\u5de5\u53d8\u5316active dc\n * \u53d8\u5316\u7279\u5b9acluster\u7684active dc\n * \u53d8\u5316\u6240\u6709\u7684active dc\n1. redis \u6302\u6389\n * setinel\u901a\u77e5meta server\n * meta server\u8f6c\u53d1\u4efb\u52a1\u81f3meta master\n * meta server master\u8c03\u7528keeper\uff0c\u6267\u884cslaveof no one destip destport\n * \u901a\u77e5console\u65b0\u7684\u53d8\u5316\uff0cconsole\u901a\u77e5\u7b2c\u4e09\u65b9\u7cfb\u7edf\uff08\u6bd4\u5982redis\u914d\u7f6e\u4e2d\u5fc3\uff09\n1. keeper active\u53d8\u5316\n * meta server\u53d1\u73b0keeper active\u53d8\u5316\n * meta server\u6267\u884ckeeper active\u53d8\u5316\u7684\u64cd\u4f5c\n - \u901a\u77e5keeper \u7531backup\u8f6cactive(keeper setstate", "start_char_idx": 0, "end_char_idx": 1159, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "50de4ec9-febb-466f-9f9a-cc9296895e83": {"__data__": {"id_": "50de4ec9-febb-466f-9f9a-cc9296895e83", "embedding": null, "metadata": {"file_path": "doc/design.md", "file_name": "design.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "59c5fcb6fbc3fb59706aa803f8303063eecb5f6a", "node_type": null, "metadata": {"file_path": "doc/design.md", "file_name": "design.md"}, "hash": "6e11b31ab4caa0c2aefc2e8a9f88aca0c5531e77966f6f207de69ad3782b56b8"}, "2": {"node_id": "59108663-a5e1-4e3e-bb21-626158eef136", "node_type": null, "metadata": {"file_path": "doc/design.md", "file_name": "design.md"}, "hash": "cffc9b3c8750b8caccc8c0efbb06e20e97c2e633a5f3bedb8720fbc4bbdfcd35"}, "3": {"node_id": "aa413a53-0dda-4ac4-8ae9-6e8e340bb4f0", "node_type": null, "metadata": {"file_path": "doc/design.md", "file_name": "design.md"}, "hash": "884969d8e53318419927356553e5c968b2ede10792819629a8798a45e6917b00"}}, "hash": "4648b816b18a48db2a4029cb99429f9ad15b94a399e1f45d6215ed7c07a0ecd9", "text": " - \u901a\u77e5keeper \u7531backup\u8f6cactive(keeper setstate active)/ checkstate(keeper getstate)\n - \u901a\u77e5redis slave: kslaveof ip port\n * \u901a\u77e5console\uff0c\n * console\u901a\u77e5\u5173\u8054meta server\n - /api/{cluster}/{shard}/upstreamkeeper/ip/port\n1. \u4e3b\u52a8\u5207\u6362\u673a\u623f\n * console\u53d1\u51fa\u5207\u6362\u673a\u623f\u6307\u4ee4\u81f3active\u7684meta server : /{cluster}/backup\n * meta server\u7ec8\u6b62setinel\n * \u5f53\u524dactive\u673a\u623f\u7684master\u53d8\u6210slave: kslaveof keeperip keeperport\n * keeper\u7b49\u5f85\u6570\u636e\u4f20\u8f93\u81f3\u5176\u4ed6\u673a\u623f\u5b8c\u6bd5\n * console\u53d1\u51fa\u6307\u4ee4\u81f3\u88ab\u63d0\u5347\u7684meta server: /{cluster}/active\n * \u88ab\u63d0\u5347\u673a\u623f\u589e\u52a0setinel\u76d1\u63a7\n * setinel\u9009\u4e3emaster\uff0c\u901a\u77e5meta\u63d0\u5347master\n * console\u53d1\u51fa\u6307\u4ee4\u81f3\u5176\u5b83backup\u673a\u623f\uff0c/{cluster}/upstreamchanged/ip:port\n \n1. \u673a\u623f\u6302\u6389\uff0c\u5207\u6362\u673a\u623f\n * \n<a name=\"\u673a\u623f\u5185\u4ea4\u4e92\"></a>\n## \u673a\u623f\u5185\u4ea4\u4e92\n<a name=\"console\"></a>\n# console\n<a name=\"db\u5b58\u50a8\"></a>\n## db\u5b58\u50a8\n<a name=\"zk\"></a>\n# zk\n<a name=\"zk\u63d0\u4f9b\u529f\u80fd\"></a>\n## zk\u63d0\u4f9b\u529f\u80fd\n1. leader\u9009\u4e3e\n 1. \u9009\u4e3e\u51fakeeper\u7684master \n 1. \u9009\u4e3e\u51fameta server\u7684master \n1. \u4e8b\u4ef6\u901a\u77e5(X)\n \u76f4\u63a5\u8c03\u7528api\u901a\u77e5\n1. meta server sharding?\n \u521d\u59cb\u5316\n resharding\n meta server\u6302\n \u4e3b\u52a8\u89e6\u53d1\n api/shard/add\n api/shard/delete\n api/shard/export\n api/shard/emport\n1. _meta\u4fe1\u606f\u5b58\u50a8_\n\nevent:\n dc1 \n cluster1 keeperAdd keeperDelte promoteMaster redisMasterChanged keeperActiveChanged\n cluster2 \n dc2\n\nmeta\n dc1(\u53ea\u5b58\u50a8\u6b64dc\u5185\u7684\u4fe1\u606f)\n metaserver1\n metaserver2\n cluster : {config} {version}\n shard {upstreamKeeper: \"\"} \n keeper \n keeper \n redis \n redis\n\nelector \n dc1 \n metaserver \n cluster \n shard \n ", "start_char_idx": 1122, "end_char_idx": 2622, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "aa413a53-0dda-4ac4-8ae9-6e8e340bb4f0": {"__data__": {"id_": "aa413a53-0dda-4ac4-8ae9-6e8e340bb4f0", "embedding": null, "metadata": {"file_path": "doc/design.md", "file_name": "design.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "59c5fcb6fbc3fb59706aa803f8303063eecb5f6a", "node_type": null, "metadata": {"file_path": "doc/design.md", "file_name": "design.md"}, "hash": "6e11b31ab4caa0c2aefc2e8a9f88aca0c5531e77966f6f207de69ad3782b56b8"}, "2": {"node_id": "50de4ec9-febb-466f-9f9a-cc9296895e83", "node_type": null, "metadata": {"file_path": "doc/design.md", "file_name": "design.md"}, "hash": "4648b816b18a48db2a4029cb99429f9ad15b94a399e1f45d6215ed7c07a0ecd9"}}, "hash": "884969d8e53318419927356553e5c968b2ede10792819629a8798a45e6917b00", "text": " shard \n keeper \n\n<a name=\"meta-server\"></a>\n# meta server\n\n<a name=\"meta-server\u4e92\u76f8\u901a\u77e5\"></a>\n## meta server\u4e92\u76f8\u901a\u77e5\n1. \u901a\u8fc7console\n1. \u901a\u8fc7zk, ureka\n1. \u901a\u8fc7apollo\n\n<a name=\"\u529f\u80fd\"></a>\n## \u529f\u80fd\n1. \u6267\u884c\u4efb\u52a1\n1. \u6267\u884c\u76d1\u63a7\u76d1\u6d4b\uff0c\u76d1\u6d4b\u8282\u70b9\u5065\u5eb7\u72b6\u6001\n\n<a name=\"\u89d2\u8272\"></a>\n## \u89d2\u8272\n* master\n - cluster resharding(meta server\u6302)\n - masterChanged API\u8c03\u7528\n* slave \n\n<a name=\"\u4efb\u52a1\u5212\u5206\"></a>\n## \u4efb\u52a1\u5212\u5206\n\u6839\u636ecluster\u5206meta server\nresharding\n\n<a name=\"masterslave\"></a>\n## master/slave\n* master\u8d1f\u8d23\u4efb\u52a1\u6267\u884c\u3001\u66f4\u65b0API\n* slave\u67e5\u8be2\n* \u5982\u679c\u66f4\u65b0API\u8c03\u7528\u5230slave\uff0c\u8f6c\u53d1\u81f3master\n<a name=\"\u4efb\u52a1\u6267\u884c\"></a>\n## \u4efb\u52a1\u6267\u884c\n* \u6d88\u8d39events\u76ee\u5f55\u4e0b\u4e8b\u4ef6\n* API\u63d0\u4f9b\u63a5\u53e3\u4f9b\u8c03\u7528\n * redis master changed \n<a name=\"api\"></a>\n## API\n* \u67e5\u8be2\n - GET /api/{cluster}/{shard}\n - GET /api/{clusterId}/{shard}/redis/master\n - GET /api/{clusterId}/{shard}/keeper/active\n - GET /api/{cluster}/{shard}/arch(info replication view)\n* \u66f4\u6539\n - POST /api/{cluster}/{shard}/redis/master/change\n slave\u8f6c\u53d1\u5230master\u6267\u884c\n - \n<a name=\"\u72b6\u6001\u67e5\u8be2\"></a>\n## \u72b6\u6001\u67e5\u8be2\n<a name=\"keeper\"></a>\n# keeper\n<a name=\"keeper\u72b6\u6001\u53d8\u5316\"></a>\n## keeper\u72b6\u6001\u53d8\u5316\n1. keeper\u542f\u52a8\n * \u5982\u679c\u4e3aactive\uff0c\u5219\u8fde\u63a5\u5bf9\u5e94\u7684redismaster\u6216\u8005upstream\n * \u5982\u679c\u4e3abackup\uff0c\u5219\u8fde\u63a5\u5bf9\u5e94\u7684active\n * \u5982\u679c\u4e3anull\uff0c\u72b6\u6001\u7f6e\u4e3aunknown\n1. meta server\u53d1\u73b0\u6ce8\u518c\u7684keeper\u53d8\u5316\n * \u9009\u4e3ekeeper active\n - \u83b7\u53d6\u6240\u6709keeper\u72b6\u6001\uff0c\u5982\u679c\u6709active\uff0c\u5219active\u8bbe\u7f6e\u4e3aactive\u7684keeper\n + \u901a\u77e5\u6240\u6709keeper\u72b6\u6001\u53d8\u5316\n - \u5982\u679c\u6ca1\u6709\uff0c\u9009\u4e3e\u51faactive\n + \u901a\u77e5\u6240\u6709keeper\u72b6\u6001\u53d8\u5316\n\n\n\n\n<a name=\"\u547d\u4ee4\"></a>\n## \u547d\u4ee4\n1. keeper getstate\n1. keeper setstate", "start_char_idx": 2637, "end_char_idx": 3993, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "a0cc4323-ec8f-4fed-9401-e44125134341": {"__data__": {"id_": "a0cc4323-ec8f-4fed-9401-e44125134341", "embedding": null, "metadata": {"file_path": "doc/gitbook/README.md", "file_name": "README.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "87c0a0a03885d1a2f92dd7da09b59a216fe18d1a", "node_type": null, "metadata": {"file_path": "doc/gitbook/README.md", "file_name": "README.md"}, "hash": "bb214e11e1b02a9fb1f429b83c8dc486e2e6deb2a28d1fafc043b1fe9d8a7d6e"}}, "hash": "bb214e11e1b02a9fb1f429b83c8dc486e2e6deb2a28d1fafc043b1fe9d8a7d6e", "text": "# \u6b22\u8fce\u9605\u8bfbXPipe\u7528\u6237\u4f7f\u7528\u624b\u518c\n\n\u8bf7\u5728\u5de6\u4fa7\u70b9\u51fb\u60f3\u8981\u4e86\u89e3\u7684\u5185\u5bb9", "start_char_idx": 0, "end_char_idx": 32, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "5321cc7b-2a86-48b8-b56c-415dde7c149b": {"__data__": {"id_": "5321cc7b-2a86-48b8-b56c-415dde7c149b", "embedding": null, "metadata": {"file_path": "doc/gitbook/_sidebar.md", "file_name": "_sidebar.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "f4e8dea3f4206b83d5a2b728be75904de53a24b5", "node_type": null, "metadata": {"file_path": "doc/gitbook/_sidebar.md", "file_name": "_sidebar.md"}, "hash": "9236fa38cf55110fd60d352fbd1660cad271eb90594f2e59d543c1501a7ef9f6"}}, "hash": "0e4be7ab299750b53b82bc29baa6e2d2ed0ca5210dbc0bc767303ec563f80731", "text": "- **1 \u7528\u6237\u6587\u6863**\n - [**XPipe\u7cfb\u7edf\u7b80\u4ecb**](reference/1.0_intro/README.md)\n - [**XPipe\u9002\u7528\u573a\u666f**](reference/1.1_why_xpipe/README.md)\n - [**\u7cfb\u7edf\u63a5\u5165\u8bf4\u660e**](reference/1.2_how_to_use/README.md)\n - [**\u6d77\u5916\u6570\u636e\u4e2d\u5fc3(Amazon)\u6570\u636e\u540c\u6b65**](reference/1.3_oversea_intro/README.md)\n - [**\u6d77\u5916\u6570\u636e\u4e2d\u5fc3(Amazon)\u6570\u636e\u540c\u6b65\u63a5\u5165\u6d41\u7a0b(for DBA)**](reference/1.4_oversea_how_to_use_for_dba/README.md)\n - [**\u73b0\u6709Redis cluster\u63a5\u5165XPipe\u64cd\u4f5c\u6d41\u7a0b(for DBA)**](reference/1.5_upgrade_to_xpipe/README.md)", "start_char_idx": 0, "end_char_idx": 433, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "9e19fb91-8258-4aca-9692-2d027073499e": {"__data__": {"id_": "9e19fb91-8258-4aca-9692-2d027073499e", "embedding": null, "metadata": {"file_path": "doc/gitbook/reference/1.0_intro/README.md", "file_name": "README.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "be00460586568a7bdf45d1a4c4df15e223068fd5", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.0_intro/README.md", "file_name": "README.md"}, "hash": "e07cb5a5f3c5c046c3fb5c0b49f61a84bbba4e37a5e42407f38de30946441f6d"}}, "hash": "e07cb5a5f3c5c046c3fb5c0b49f61a84bbba4e37a5e42407f38de30946441f6d", "text": "XPipe\u4e3b\u8981\u89e3\u51b3Redis DR\u4ee5\u53ca\u591a\u673a\u623f\u8bbf\u95ee\u95ee\u9898\n\n\u5177\u4f53\u53ef\u53c2\u89c1\u300a[XPipe\u4f7f\u7528\u6587\u6863](http://conf.ctripcorp.com/pages/viewpage.action?pageId=113945769#XPipe\u4f7f\u7528\u6587\u6863-\u7cfb\u7edf\u7b80\u4ecb)\u300b\u7ae0\u8282\uff1a\u7cfb\u7edf\u7b80\u4ecb\n\n## \u5173\u8054\u65b9\n\n- XPipe (\u8d1f\u8d23\u4eba: Slight Wu \uff08\u5434\u9a8b\u6210\uff09Wenchao Meng \uff08\u5b5f\u6587\u8d85\uff09\uff09\n - \u8d1f\u8d23Redis\u670d\u52a1\u5668\u7ba1\u7406\uff0cDR\u5207\u6362\u7b49\n- CRedis (\u8d1f\u8d23\u4eba: Slight Wu\uff08\u5434\u9a8b\u6210\uff09\uff09\n - \u8d1f\u8d23\u5ba2\u6237\u7aef\u8def\u7531\n- DBA \uff08\u90ae\u4ef6\u7ec4: [email protected] \uff09\n - \u8d1f\u8d23\u5177\u4f53\u7684\u96c6\u7fa4\u63a5\u5165\u548cDR\u5207\u6362\u64cd\u4f5c\n\n## DR\u5207\u6362\u6267\u884c\u65b9\n\n- \u76ee\u524dDR\u5207\u6362\u7531DBA\u7edf\u4e00\u64cd\u4f5c\n- \u7528\u6237\u6709\u5207\u6362\u9700\u6c42\u4e5f\u53ef\u76f4\u63a5\u8054\u7cfbDBA [email protected]\n\n## \u76ee\u524d\u7684DR\u5207\u6362\u4e3a\u4ec0\u4e48\u624b\u5de5\u8fdb\u884c\uff1f\n\nDR\u5207\u6362\u662f\u673a\u623f\u7ea7\u522b\u7684\u6545\u969c\u5904\u7406\u65b9\u6848\uff0c\u81ea\u52a8\u5207\u6362\u7684\u96be\u70b9\u5728\u4e8e\u5224\u5b9a\u673a\u623f\u662f\u5426\u6302\uff1a\n\n1. \u89c2\u6d4b\u70b9\u653e\u5728\u673a\u623f\u5185\u90e8\uff0c\u81ea\u8eab\u6302\u4e86\u65e0\u6cd5\u5224\u65ad\n2. \u89c2\u6d4b\u70b9\u653e\u5728\u673a\u623f\u5916\u90e8\uff0c\u5f88\u53ef\u80fd\u662f\u7531\u4e8e\u673a\u623f\u4e4b\u95f4\u7f51\u7edc\u4e0d\u901a\n3. \u76ee\u524d\u643a\u7a0b\u4e3b\u8981\u6709\u91d1\u6865\u3001\u6b27\u9633\u4e24\u4e2a\u673a\u623f\uff0c\u65e0\u6cd5\u591a\u6570\u70b9\u51b3\u7b56", "start_char_idx": 0, "end_char_idx": 515, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "02e856e5-4211-4a27-9204-e966907f1d74": {"__data__": {"id_": "02e856e5-4211-4a27-9204-e966907f1d74", "embedding": null, "metadata": {"file_path": "doc/gitbook/reference/1.1_why_xpipe/README.md", "file_name": "README.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "231924dc75127b769db8454825b9599100070419", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.1_why_xpipe/README.md", "file_name": "README.md"}, "hash": "aefd12bff580e02247cec85619b34958ec61ed4ae2ccd643bdc043ae023147e6"}, "3": {"node_id": "f3074870-8fbf-4322-b1d2-2111e6aac9af", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.1_why_xpipe/README.md", "file_name": "README.md"}, "hash": "f14507d73b79a1202a84507aa0d5dad3496385f802dc103928f2e970b0dc05b7"}}, "hash": "ead3a339428fdfde5e3cc7d563b043defb2a7fc6cf5e924ba5a45a527181bc50", "text": "## \u5982\u4f55\u5224\u65ad\u4e1a\u52a1\u662f\u5426\u9700\u8981\u63a5\u5165XPipe\uff1f\n\n\u5047\u8bbeIDC1\u6302\u4e86\uff0c\u8fdb\u884cDR\u5207\u6362\uff0c\u4e1a\u52a1\u5207\u6362\u5230IDC2\n\n- \u5728IDC2\uff0c\u5982\u679c\u6ca1\u6709Redis\uff0c\u4e1a\u52a1\u4f9d\u7136\u80fd\u591f\u6b63\u5e38\u8fd0\u884c\uff0c\u5219**\u4e0d\u9700\u8981\u63a5\u5165XPipe**\n- \u5982\u679c\u9700\u8981Redis\uff0c\u4f46\u662f\u80fd\u63a5\u53d7Redis DBA**\u5c0f\u65f6\u7ea7\u65f6\u95f4**\u91cd\u5efa**\u65b0\u7684****\u7a7a\u7684**Redis\u7f13\u5b58\uff0c\u5219**\u4e0d\u9700\u8981\u63a5\u5165XPipe**\n- \u5982\u679c\u9700\u8981Redis\uff0c\u5e0c\u671bRedis**\u7acb\u5373\u53ef\u7528**\uff0c\u5e76\u4e14IDC1\u5185\u7684\u6570\u636e\u4ecd\u7136**\u5b58\u5728**\uff0c**\u5219\u9700\u8981\u63a5\u5165XPipe**\n\n## \u63a5\u5165XPipe\u8d44\u6e90\u6d88\u8017\u4ee5\u53ca\u53ef\u80fd\u95ee\u9898\n\n- \u8d44\u6e90\u6d88\u8017\u589e\u52a01.2\u500d\n\n \u5047\u8bbe\u76ee\u524d\u573a\u666f\uff1a\n\n \u4e1a\u52a1Redis\u96c6\u7fa4\u90e8\u7f72\u5728IDC1\uff0c\u9700\u8981\u5728IDC2\u5efa\u7acbDR\uff1b\u5728IDC1\u5185\u6709\u6709\u4e24\u4e2aRedis\u5b9e\u4f8b\uff0c\u4e00\u4e2amaster\u3001\u4e00\u4e2aslave\n\n - IDC2\u5185\u9700\u8981\u589e\u52a0\u548cIDC1\u5185\u76f8\u540c\u6570\u76ee\u7684Redis\u5b9e\u4f8b \uff1a +2\n - \u9700\u8981\u589e\u52a04\u4e2akeeper\u590d\u5236\u8282\u70b9\uff0c\u4f46\u662fkeeper\u8d44\u6e90\u6d88\u8017\u4e3a\u7ea6\u4e3aRedis\u76840.1\u500d\uff1a +0.4\n - \u6240\u6709\u8d44\u6e90\u53d8\u5316\uff1a2->4.4\uff0c\u589e\u52a01.2\u500d\n\n- XPipe\u5f02\u6b65\u590d\u5236\n\n - \u6781\u7aef\u60c5\u51b5\u4e0bDR\u5207\u6362\u65f6\u4f1a\u6709\u6570\u636e\u4e22\u5931\uff0c\u53ef\u80fd\u4e22\u5931\u6570\u636e\u7684\u573a\u666f\uff1a\n - \u4e1a\u52a1\u5199\u5165master\u6210\u529f\uff0c\u5199\u5165\u7684\u6570\u636e\u6ca1\u6709\u590d\u5236\u51fa\u53bbmaster\u5c31\u6302\u6389\n - \u673a\u623f\u4e4b\u95f4\u7f51\u7edc\u5f02\u5e38\uff0c\u6570\u636e\u65e0\u6cd5\u8de8\u673a\u623f\u4f20\u8f93\n - XPipe\u4fdd\u8bc1\u6700\u7ec8\u4e00\u81f4\u6027\uff0c\u65e0\u6cd5\u63d0\u4f9b\u5f3a\u4e00\u81f4\u6027\u4fdd\u8bc1\n - \u73a9\u4e50\u90e8\u95e8case\u4e3e\u4f8b\n - \u95ee\u9898\u63cf\u8ff0\n - \u73a9\u4e50BU\u4e00\u4e2a\u4e1a\u52a1\u7cfb\u7edf\u7684Redis\u96c6\u7fa4\u6709\u4e09\u4e2a\u5206\u7247(shard/group)\n -", "start_char_idx": 0, "end_char_idx": 685, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "f3074870-8fbf-4322-b1d2-2111e6aac9af": {"__data__": {"id_": "f3074870-8fbf-4322-b1d2-2111e6aac9af", "embedding": null, "metadata": {"file_path": "doc/gitbook/reference/1.1_why_xpipe/README.md", "file_name": "README.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "231924dc75127b769db8454825b9599100070419", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.1_why_xpipe/README.md", "file_name": "README.md"}, "hash": "aefd12bff580e02247cec85619b34958ec61ed4ae2ccd643bdc043ae023147e6"}, "2": {"node_id": "02e856e5-4211-4a27-9204-e966907f1d74", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.1_why_xpipe/README.md", "file_name": "README.md"}, "hash": "ead3a339428fdfde5e3cc7d563b043defb2a7fc6cf5e924ba5a45a527181bc50"}, "3": {"node_id": "82677fb9-abe3-4038-8263-5576c47da4f2", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.1_why_xpipe/README.md", "file_name": "README.md"}, "hash": "5837e5fc5c8a4954fdf7bf44d91c9a26faf4587a0f0857ccbf1bec7186bec5de"}}, "hash": "f14507d73b79a1202a84507aa0d5dad3496385f802dc103928f2e970b0dc05b7", "text": " - \u8981\u6c42\u4e09\u4e2a\u5206\u7247\u540c\u65f6\u80fd\u591f\u8bfb\u5230\u7279\u5b9a\u4e1a\u52a1\u6570\u636e\uff0c\u624d\u80fd\u63d0\u4f9b\u670d\u52a1\n - DR\u5207\u6362\u540e\uff0c\u7531\u4e8e\u67d0\u4e2a\u5206\u7247\u6570\u636e\u4e0d\u9f50(\u53ef\u80fd\u5207\u6362\u8fc7\u7a0b\u4e2d\u5199\u5165\u5f02\u5e38\uff0c\u65e0\u91cd\u8bd5)\uff0c\u5bfc\u81f4\u5207\u6362\u540e\u90e8\u5206\u666f\u70b9\u65e0\u6cd5\u63d0\u4f9b\u670d\u52a1\n - \u89e3\u51b3\n - \u9700\u8981\u4fdd\u8bc1\u5f3a\u4e00\u81f4\u6570\u636e\u5199\u5165\u4e00\u4e2aRedis\u5206\u7247\n\n- \u7f13\u5b58\u8865\u507f\n\n - \u5982\u679c\u4e1a\u52a1\u9700\u8981\u786e\u4fdd\n\n **\u7f13\u5b58\u4e0e\u6570\u636e\u5e93\u6570\u636e\u5f3a\u4e00\u81f4**\uff0c\u8bf7\u5173\u6ce8\u6b64\u8282\n\n - XPipe\u5207\u6362\u6d41\u7a0b\u4f1a\u5148\u5173\u95edmaster\u7684\u5199\u5165\uff0c\u7136\u540e\u518d\u6267\u884c\u5207\u6362\uff0c\u5728\u5207\u6362\u8fc7\u7a0b\u4e2d\uff0c\u4e1a\u52a1\u4f1a\u6709\u77ed\u6682\u7684\u5199\u5165\u62a5\u9519\uff08\u6839\u90e8\u4e0d\u540c\u5ba2\u6237\u7aef\u7248\u672c\uff09\n - \u5728\u5207\u6362\u671f\u95f4\uff0c\u5982\u679c\u5199\u5165\u5931\u8d25\u7684\u6570\u636e**\u6ca1\u6709\u91cd\u8bd5\u6216\u8005\u8865\u507f\u673a\u5236**\uff0c\u53ef\u80fd\u4f1a\u5bfc\u81f4**\u7f13\u5b58\u4e0e\u6570\u636e\u5e93\u6570\u636e\u4e0d\u4e00\u81f4**\n\n - \u89e3\u51b3\u65b9\u6848\n\n - \u5347\u7ea7CRedis\u5ba2\u6237\u7aef\u7248\u672c(\u964d\u4f4e\u5207\u6362\u8fc7\u7a0b\u4e2d\u5199\u5165\u5931\u8d25\u65f6\u95f4)\n - \u5efa\u7acb\u7f13\u5b58\u5199\u5165\u5931\u8d25\u7684**\u91cd\u8bd5\u548c\u8865\u507f**\u673a\u5236\n\n- \u6781\u7aef\u60c5\u51b5\u4e0b\uff0c\u591a\u4e2a\u673a\u623f\u540c\u65f6\u6302\u6389\uff0c\u6570\u636e\u4ecd\u7136\u53ef\u80fd\u4e22\u5931\n\n## \u5404\u65b9\u6848\u5bf9\u6bd4\n\n| | \u65e0XPipe\uff0cDBA\u4e0d\u91cd\u5efa\u7f13\u5b58 | \u65e0XPipe\uff0cDBA\u91cd\u5efa\u7f13\u5b58 | XPipe |\n| :--------------------------- | :--------------------- | :------------------- | :------- |\n| DR\u5207\u6362\u65f6\u95f4 | \u65e0 | \u5c0f\u65f6\u7ea7 | 3\u79d2 |\n| DR\u540e\uff0c\u65b0\u673a\u623f\u662f\u5426\u6709\u539f\u673a\u623f\u6570\u636e | \u65e0 | \u65e0 | \u6709 |\n| \u9700\u8981\u8d44\u6e90 ", "start_char_idx": 685, "end_char_idx": 1448, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "82677fb9-abe3-4038-8263-5576c47da4f2": {"__data__": {"id_": "82677fb9-abe3-4038-8263-5576c47da4f2", "embedding": null, "metadata": {"file_path": "doc/gitbook/reference/1.1_why_xpipe/README.md", "file_name": "README.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "231924dc75127b769db8454825b9599100070419", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.1_why_xpipe/README.md", "file_name": "README.md"}, "hash": "aefd12bff580e02247cec85619b34958ec61ed4ae2ccd643bdc043ae023147e6"}, "2": {"node_id": "f3074870-8fbf-4322-b1d2-2111e6aac9af", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.1_why_xpipe/README.md", "file_name": "README.md"}, "hash": "f14507d73b79a1202a84507aa0d5dad3496385f802dc103928f2e970b0dc05b7"}}, "hash": "5837e5fc5c8a4954fdf7bf44d91c9a26faf4587a0f0857ccbf1bec7186bec5de", "text": " |\n| \u9700\u8981\u8d44\u6e90 | \u5355DC\u8d44\u6e90 | \u5355DC\u8d44\u6e90 | \u8d44\u6e90\u52a0\u500d |", "start_char_idx": 1435, "end_char_idx": 1515, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "a08364a6-c23d-4df5-8b5d-84137fbebd4e": {"__data__": {"id_": "a08364a6-c23d-4df5-8b5d-84137fbebd4e", "embedding": null, "metadata": {"file_path": "doc/gitbook/reference/1.2_how_to_use/README.md", "file_name": "README.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "ab72ca168649fc7fbb292dec7495bbeeabde0407", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.2_how_to_use/README.md", "file_name": "README.md"}, "hash": "1c2369a0201a510f5662de686af2c9ddf680e808c92373537bd4ed1d5b456aa5"}, "3": {"node_id": "e45b082d-c3ec-45aa-b630-6db49a62728b", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.2_how_to_use/README.md", "file_name": "README.md"}, "hash": "90958041cd874f96869bcb7304c5f4f0204e996c69880a7b18f1610dfdc969e9"}}, "hash": "cf0cbb478084c17c458c0876dec7577ca7093be1e2935cccf4806a630b673388", "text": "## \u63a5\u5165\u6ce8\u610f\u4e8b\u9879\n\n### XPipe\n\n- XPipe\u4f7f\u7528Redis\u7248\u672c\u4e3a[XRedis](http://conf.ctripcorp.com/pages/viewpage.action?pageId=113945769#XPipe\u4f7f\u7528\u6587\u6863-XRedis)\uff0c\u6700\u65b0\u7248\u672c\u57fa\u4e8eRedis 4.0.8\u66f4\u6539\uff0c\u652f\u63014.0.8\u6240\u6709\u529f\u80fd\uff08\u76ee\u524d\u751f\u4ea7\u73af\u5883\u7248\u672c2.8.19\uff09\n- \u4f18\u52bf\n - \u589e\u91cf\u540c\u6b65\n \u8001\u76842.8.19\u7684Redis\u5728\u5207\u6362\u8fc7\u7a0b\u4e2d\u5168\u91cf\u540c\u6b65\uff0cXRedis\u53ef\u4ee5\u5728\u5207\u6362\u8fc7\u7a0b\u505a\u5230\u589e\u91cf\uff0c\u63d0\u5347\u5207\u6362\u6027\u80fd\u548c\u7cfb\u7edf\u53ef\u7528\u6027\u3002\n- XRedis\u7248\u672c\u4e0b\u8f7d\uff1a[XPipe\u4f7f\u7528\u6587\u6863#XRedis](http://conf.ctripcorp.com/pages/viewpage.action?pageId=113945769#XPipe\u4f7f\u7528\u6587\u6863-XRedis)\n\n### CRedis(\u5f3a\u4f9d\u8d56)\n\n- CRedis\u652f\u6301\u4e09\u79cd\u8def\u7531\u6a21\u5f0f\uff0c\u53ef\u4ee5\u5728CRedis\u914d\u7f6e\u81ea\u52a8\u66f4\u65b0\u751f\u6548\n\n- - \u8bfb\u5199master\n - \u5199\u4e3b\u673a\u623f\uff0c\u8bfb\u53d6\u4e3b\u673a\u623fslave\n - \u5982\u679c\u4e3b\u673a\u623fslave\u6302\u6389\uff0c\u81ea\u52a8\u5207\u6362\u5230\u8bfb\u53d6master\n - \u5199\u4e3b\u673a\u623f\uff0c\u5c31\u8fd1\u8bfb\u53d6\n - \u4e3b\u673a\u623f\u5e94\u7528\uff1a\u5982\u679c\u4e3b\u673a\u623fslave\u6302\u6389\uff0c\u81ea\u52a8\u5207\u6362\u5230\u8bfb\u53d6master\n - \u4ece\u673a\u623f\u5e94\u7528\uff1a\u5982\u679c\u4ece\u673a\u623fslave\u6302\u6389\uff0c\u81ea\u52a8\u5207\u6362\u5230\u8bfb\u53d6\u4e3b\u673a\u623fslave\uff1b\u4e3b\u673a\u623fslave\u6302\u6389\uff0c\u4e1a\u52a1\u62a5\u9519\uff0c\u4e0d\u4f1a\u5207\u5230master(\u9632\u6b62\u5bf9master\u8fc7\u5927\u538b\u529b)\n\n- CRedis\u8def\u7531\u751f\u6548\u65f6\u95f4\n\n - \u8001\u7248\u672cCRedis\u5e73\u5747\u8def\u7531\u751f\u6548\u65f6\u95f460S\n - .net \u7248\u672c < 1.2.5.0\n - java \u7248\u672c < 2.5.2\n - \u652f\u6301\u8def\u7531\u7acb\u5373\u751f\u6548\uff08**\u5f3a\u70c8\u63a8\u8350\u4f7f\u7528**\uff0c\u53ef\u4ee5\u5c06\u5207\u6362\u673a\u623f\u65f6\u95f4\u964d\u4f4e\u52305\u79d2\u5185, \u5ef6\u65f6\u548c\u6253\u70b9\u5bf9\u7528\u6237\u66f4\u52a0\u53cb\u597d\uff09\n - .net \u7248\u672c>=1.3.1.5\n - java \u7248\u672c>=4.3.6\n\n### \u63a5\u5165\u6d41\u7a0b\n\n-", "start_char_idx": 0, "end_char_idx": 829, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "e45b082d-c3ec-45aa-b630-6db49a62728b": {"__data__": {"id_": "e45b082d-c3ec-45aa-b630-6db49a62728b", "embedding": null, "metadata": {"file_path": "doc/gitbook/reference/1.2_how_to_use/README.md", "file_name": "README.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "ab72ca168649fc7fbb292dec7495bbeeabde0407", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.2_how_to_use/README.md", "file_name": "README.md"}, "hash": "1c2369a0201a510f5662de686af2c9ddf680e808c92373537bd4ed1d5b456aa5"}, "2": {"node_id": "a08364a6-c23d-4df5-8b5d-84137fbebd4e", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.2_how_to_use/README.md", "file_name": "README.md"}, "hash": "cf0cbb478084c17c458c0876dec7577ca7093be1e2935cccf4806a630b673388"}, "3": {"node_id": "2c55445c-04b1-4705-9871-adaa02f38f1b", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.2_how_to_use/README.md", "file_name": "README.md"}, "hash": "843c6e38a5250eb4d83a0645ac743953c9b342fc19b4c255b5c2aaf2a74eade3"}}, "hash": "90958041cd874f96869bcb7304c5f4f0204e996c69880a7b18f1610dfdc969e9", "text": "\u63a5\u5165\u6d41\u7a0b\n\n- \u5347\u7ea7\u4ee3\u7801CRedis\u7248\u672c(**\u53ef\u9009**\uff0c\u4e0d\u5347\u7ea7\u4e5f\u53ef\u8fdb\u884cDR\u5207\u6362\uff0c\u5347\u7ea7\u540e\u53ef\u4ee5\u51cf\u5c11DR\u5207\u6362\u65f6\u95f4)\n\n - .net\u5ba2\u6237\u7aef >= 1.2.5.0\n - java\u5ba2\u6237\u7aef >= 2.5.2\n\n- \u6d4b\u8bd5\u73af\u5883\u5347\u7ea7Redis-Server\u7248\u672c\u3010\u81ea\u52a9\u64cd\u4f5c\uff0c\u6709\u95ee\u9898\u8bf7\u8054\u7cfb\u6d4b\u8bd5\u73af\u5883Redis\u8d1f\u8d23\u4eba\uff1a [Brad Lee \uff08\u674e\u5251\uff09](http://conf.ctripcorp.com/display/~jian.li) [Kun Chen \uff08\u9648\u6606\uff09](http://conf.ctripcorp.com/display/~chenkun) \u3011\n \u6d4b\u8bd5\u73af\u5883\u9700\u8981\u5347\u7ea7Redis\u7248\u672c\u81f3XRedis\u6700\u65b0\u7248\u672c\uff0c\u9a8c\u8bc1\u4e1a\u52a1\u529f\u80fd\u5728\u6b64\u7248\u672c\u4e0a\u529f\u80fd\u6b63\u5e38\u3002\n\n \u4ee5\u4e0b\u662f\u5347\u7ea7\u6d41\u7a0b\u94fe\u63a5\n\n http://qate.qa.nt.ctripcorp.com/#/create_redis\n \u5982\u4e0b\uff0c\u8bf7\u9009\u62e9\u201c\u6e05\u7a7acredis\u539f\u914d\u7f6e\u201d\n \n\n- \u751f\u4ea7\u73af\u5883\u63a5\u5165\uff08\u4e0d\u5f71\u54cd\u4e1a\u52a1\uff09\n \u751f\u4ea7\u73af\u5883\u5728\u5f02\u5730\u673a\u623f\u5efa\u7acbRedis\u5b9e\u65f6\u590d\u5236\u5173\u7cfb\n \u751f\u4ea7\u73af\u5883Redis\u8d1f\u8d23\u4eba\uff1a\u6c5f\u6d69([[email protected]](mailto:[email protected])) \u5bff\u5411\u6668 [Sunny Shou \uff08\u5bff\u5411\u6668\uff09](http://conf.ctripcorp.com/display/~xcshou)\n\n- \u751f\u4ea7\u73af\u5883\u6f14\u7ec3**(\u53ef\u9009)**\n \u6a21\u62df\u673a\u623f\u6302\u6389\uff0cDR\u5207\u6362\u7684\u573a\u666f\n \u6f14\u7ec3\u8bf7\u8054\u7cfbDBA\uff1a\u6c5f\u6d69([[email protected]](mailto:[email protected])), \u5bff\u5411\u6668 [Sunny Shou \uff08\u5bff\u5411\u6668\uff09](http://conf.ctripcorp.com/display/~xcshou)\n\n## \u63a5\u5165\u63a5\u53e3\n\n**\u90ae\u4ef6\u6a21\u677f\uff1a**\n\n\u6536\u4ef6\u4eba: [email protected], [Hao Jiang \uff08\u6c5f\u6d69\uff09\uff08FU-IT\uff09\uff08\u7f51\u7ad9\u8fd0\u8425\u4e2d\u5fc3\uff09](http://conf.ctripcorp.com/display/~jiang_h)\n\n\u6284\u9001: [email protected]\n\n\u63a5\u5165XPipe\u7684Redis\u96c6\u7fa4\u4fe1\u606f\u89c1\u9644\u4ef6\n@\u6c5f\u6d69", "start_char_idx": 823, "end_char_idx": 1806, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "2c55445c-04b1-4705-9871-adaa02f38f1b": {"__data__": {"id_": "2c55445c-04b1-4705-9871-adaa02f38f1b", "embedding": null, "metadata": {"file_path": "doc/gitbook/reference/1.2_how_to_use/README.md", "file_name": "README.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "ab72ca168649fc7fbb292dec7495bbeeabde0407", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.2_how_to_use/README.md", "file_name": "README.md"}, "hash": "1c2369a0201a510f5662de686af2c9ddf680e808c92373537bd4ed1d5b456aa5"}, "2": {"node_id": "e45b082d-c3ec-45aa-b630-6db49a62728b", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.2_how_to_use/README.md", "file_name": "README.md"}, "hash": "90958041cd874f96869bcb7304c5f4f0204e996c69880a7b18f1610dfdc969e9"}}, "hash": "843c6e38a5250eb4d83a0645ac743953c9b342fc19b4c255b5c2aaf2a74eade3", "text": "\u8bf7\u5728\u751f\u4ea7\u73af\u5883\u63a5\u5165XPipe\uff0c\u652f\u6301DR\uff08\u6216\u8005\u5176\u5b83\u4e1a\u9700\u6c42\uff09\n\n[XPipe \u63a5\u5165\u8bf7\u6c42.oft](http://conf.ctripcorp.com/download/attachments/133504599/XPipe \u63a5\u5165\u8bf7\u6c42.oft?version=2&modificationDate=1590569931000&api=v2)\n\n\n\n**\u9644\u4ef6\u5185\u5bb9\uff1a**\n\n| BU/SBU | Redis \u5b9e\u4f8b\u540d | UAT\u73af\u5883 | \u751f\u4ea7\u73af\u5883 | \u5e94\u7528 | \u5f71\u54cd\u8303\u56f4 |\n| ------ | ----------------------- | ------- | -------- | -------------- | -------------------- |\n| \u706b\u8f66\u7968 | train_data_phenix_redis | \u221a | \u221a | \u706b\u8f66\u7968\u6570\u636e\u7cfb\u7edf | \u643a\u7a0b\u706b\u8f66\u8f66\u6b21\u6570\u636e\u67e5\u8be2 |\n\n## \u6027\u80fd\u7a33\u5b9a\u6027\u6d4b\u8bd5\u62a5\u544a\n\n## [\u673a\u7968\u90e8\u95e8\u6d4b\u8bd5\u62a5\u544a](http://conf.ctripcorp.com/pages/viewpage.action?pageId=133500894)\n\n\u6d4b\u8bd5\u53d9\u8981\uff1a\n\n- \u5199\u5165\u4e3b\u673a\u623f\uff0csleep\u7279\u5b9a\u65f6\u95f4\uff0c\u4ece\u4ece\u673a\u623f\u8bfb\u53d6\u6570\u636e\n- 2ms\u6210\u529f\u738799.9%\n- 1s\u5185\u6d88\u606f\u8bfb\u53d6\u6210\u529f\u7387100%\n- DR\u5207\u6362\u65f6\u95f45\u79d2\u5de6\u53f3\n\n## [XPipe\u6027\u80fd\u7a33\u5b9a\u6027\u6d4b\u8bd5\u62a5\u544a](http://conf.ctripcorp.com/pages/viewpage.action?pageId=113945795)\n\n\u6d4b\u8bd5\u53d9\u8981\uff1a\n\n- \u751f\u4ea7\u73af\u588324\u5c0f\u65f6\uff0c10000QPS\uff0c\u6bcf\u6761\u6d88\u606f100\u5b57\u8282\uff0c\u7cfb\u7edf\u8868\u73b0\u7a33\u5b9a", "start_char_idx": 1814, "end_char_idx": 2559, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "d0de9736-ccad-450e-b4a1-49d4cdb8b941": {"__data__": {"id_": "d0de9736-ccad-450e-b4a1-49d4cdb8b941", "embedding": null, "metadata": {"file_path": "doc/gitbook/reference/1.3_oversea_intro/README.md", "file_name": "README.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "350021a40b38746aea78dcf46408053627cc6997", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.3_oversea_intro/README.md", "file_name": "README.md"}, "hash": "21def68593118d303535d4356f280567a25866f75580e596984934f59cf1c59f"}}, "hash": "21def68593118d303535d4356f280567a25866f75580e596984934f59cf1c59f", "text": "## \u539f\u7406\n\n\u53c2\u8003\uff1ahttps://mp.weixin.qq.com/s/LeSSdT6bOEFzZyN26PRVzg\n\n## \u6570\u636e\u540c\u6b65\u5ef6\u8fdf\u76d1\u63a7\u6570\u636e\n\n### Dashboard\n\n- Metric\u540d\u5b57\uff1a fx.xpipe.delay\n - Tag\n - cluster \u96c6\u7fa4\u540d\n - shard CRedis\u96c6\u7fa4\u5206\u7247\u540d\n - ip Redis\u7684IP\u5730\u5740\n - port Redis \u7aef\u53e3\n - dc Redis\u6240\u5728\u673a\u623f\n - console-dc \u76d1\u63a7\u8282\u70b9\u6240\u5728\u673a\u623f\n- \u4f8b\u5982\uff1a\n - http://dashboard.fx.ctripcorp.com/#report/4416795\n\n## \u4e1a\u52a1\u540c\u4e8b\u63a5\u5165\u6ce8\u610f\u4e8b\u9879\n\n- \u4e0a\u6d77->\u6d77\u5916\u5355\u5411\u6570\u636e\u540c\u6b65\uff0c\u6d77\u5916\u673a\u623fRedis\u53ef\u8bfb\uff0c**\u4e0d\u53ef\u5199**\n- \u5f02\u5730\u673a\u623f\u6570\u636e\u540c\u6b65, \u987b\u63a5\u53d7\u6781\u7aef\u60c5\u51b5\u4e0b**20\u5206\u949f**\u7684\u6570\u636e\u5ef6\u8fdf \n- \u96c6\u7fa4\u4e2d\u5355\u4e2agroup\u7684\u5e73\u5747**\u5199\u5165**\u6d41\u91cf\u4e0d\u80fd\u8d85\u8fc75MB/S\n- \u652f\u6301CRedis Java\u5ba2\u6237\u7aef\n - \u7248\u672c>=3.1.0 (\u63a8\u8350\u4f7f\u7528 4.3.6 \u4ee5\u4e0a\u7248\u672c)\n\n### \u8be6\u7ec6\u4fe1\u606f\n\n#### \u6570\u636e\u5ef6\u8fdf\n\n**\u7531\u4e8e\u6570\u636e\u540c\u6b65\u8d70\u7684\u662f\u516c\u7f51 TCP**, \u6839\u636e\u6846\u67b6\u4e00\u5e74\u591a\u7684\u7ebf\u4e0a\u7ecf\u9a8c, \u6781\u7aef\u60c5\u51b5\u4e0b, 20 \u5206\u949f\u7684\u6570\u636e\u5ef6\u8fdf\n\n\u8be6\u7ec6\u6253\u70b9\u4fe1\u606f\u53ef\u89c1 http://hickwall.ctripcorp.com/grafanav2/d/VuuzwxvZk/xpipe?orgId=6\n\n| IDC | AVG | 99 \u7ebf | 999 \u7ebf |\n| :--- | :---- | :-------- | :-------- |\n| FRA | 250ms | 500~600ms | 600~800ms |\n| SIN | 90ms | 170~230ms | 230~280ms |\n| YMQ | 250ms | 320~380ms | 370~500ms |\n\n## \u63a5\u5165\u6d41\u7a0b\n\n### \u90ae\u4ef6\u5230:\n\n\u6536\u4ef6\u4eba: [[email protected]](mailto:[email protected])\n\n\u6284\u9001: [[email protected]](mailto:[email protected])\n\n\n\u90ae\u4ef6\u8bf4\u6e05\u695a\u9700\u8981\u63a5\u5165\u96c6\u7fa4\uff0c\u6d77\u5916\u540c\u6b65\u7684\u6570\u636e\u4e2d\u5fc3", "start_char_idx": 0, "end_char_idx": 1058, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "fd0d2375-39e2-4bce-8e39-1182a122a1b4": {"__data__": {"id_": "fd0d2375-39e2-4bce-8e39-1182a122a1b4", "embedding": null, "metadata": {"file_path": "doc/gitbook/reference/1.4_oversea_how_to_use_for_dba/README.md", "file_name": "README.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "4fdc8892ee752699cbd6e4d4d5f395dfdbcd06eb", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.4_oversea_how_to_use_for_dba/README.md", "file_name": "README.md"}, "hash": "009ed108948af65b95349521e4d096cf73a0ec2838e00c779a2d4f4011404261"}}, "hash": "009ed108948af65b95349521e4d096cf73a0ec2838e00c779a2d4f4011404261", "text": "## AWS \u673a\u623f\u6545\u969c\u64cd\u4f5c\u65b9\u6848\n\nAWS \u673a\u623f\u90e8\u5206 redis \u6545\u969c, \u9700\u8981\u91cd\u65b0\u4e0a\u7ebf redis. \u53ef\u4ee5\u5148\u628a\u65b0\u4e0a\u7ebf redis \u4f5c\u4e3a slave, \u63a5\u5165 AWS \u7aef\u7684\u540c\u4e00 group \u4e2d redis \u8fdb\u884c\u540c\u6b65.\n\n\u540c\u6b65\u5b8c\u6210\u540e, \u518d\u5728 xpipe \u4e0a\u6dfb\u52a0 redis, \u7531 xpipe \u8fdb\u884c\u7ba1\u7406\n\n## \u63a5\u5165\u6d41\u7a0b\n\n- \u63a5\u5165\u4e4b\u524d, \u8bf7\u5148\u786e\u8ba4 Redis \u5b9e\u4f8b\u5065\u5eb7\u72b6\u6001\u826f\u597d, \u5e76\u4e14 CRedis \u7aef\u5df2\u7ecf\u90e8\u7f72\u597d\n\n - \u63a5\u5165 XPipe \u524d, \u5148\u5c06 CMS \u4e0a\u76f8\u5173 Redis Cluster \u8bbe\u7f6e\u4e3a xpipe DR\n\n - \u8c03\u6574 CMS \u4e0a Redis Cluster \u7684\u8def\u7531\u7b56\u7565 (\u5199 Master \u8bfb\u4e3b\u673a\u623f Slave)\n\n - \u6dfb\u52a0 AWS \u7684 Redis \u5b9e\u4f8b, \u5c06 Redis \u7684 IDC \u8bbe\u7f6e\u4e3a\u76f8\u5e94\u7ad9\u70b9 (\u76ee\u524d\u6cd5\u5170\u514b\u798f\u4e3a FRA-AWS)\n\n - Redis \u5b9e\u4f8b\u7684 Master \u81f3\u4e3a unkown\n\n \n\n- \u9488\u5bf9\u5b58\u91cf\u96c6\u7fa4, \u7ed1\u5b9a\u6570\u636e\u4e2d\u5fc3 (\u65b0\u63a5\u5165\u96c6\u7fa4\u7565\u8fc7)\n\n\n\n\n\n- \u53c2\u8003 [XPipe\u4f7f\u7528\u6587\u6863](http://conf.ctripcorp.com/pages/viewpage.action?pageId=113945769) \u6dfb\u52a0\u76f8\u5173 Redis \u548c Keeper\n\n", "start_char_idx": 0, "end_char_idx": 823, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "13221de7-6c68-4367-b1be-f35b06fc3a74": {"__data__": {"id_": "13221de7-6c68-4367-b1be-f35b06fc3a74", "embedding": null, "metadata": {"file_path": "doc/gitbook/reference/1.5_upgrade_to_xpipe/README.md", "file_name": "README.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "f41ad767777f1af3dbd531eb9ee98ead716942a5", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.5_upgrade_to_xpipe/README.md", "file_name": "README.md"}, "hash": "5f62340bff002103b484740f1f77f7eb1a3f7395e589432209a9f9d19e7e97c2"}, "3": {"node_id": "9f448401-cda9-4b5f-9a80-c79e111f9963", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.5_upgrade_to_xpipe/README.md", "file_name": "README.md"}, "hash": "b0946d21f3e36bf5af5d142e4e0b39e0f18bb3dfdab97906c3becd49ba7cc1a2"}}, "hash": "9b7fb2ce526aee97b401a041522ea93ee4de403abd843dd8c53d67e4ccc56940", "text": "## \u63a5\u5165\u539f\u5219\uff1a\n\n1. **\u6838\u5fc3**\u4e14**\u6d41\u91cf\u5927**\u7684Redis\u96c6\u7fa4\u8bf7\u653e\u5728outage\u7a97\u53e3\u671f\u8fdb\u884c\u63a5\u5165\n\n 1. \u201c**\u6838\u5fc3Redis\u96c6\u7fa4**\u201d\u8bf7\u548c\u4e1a\u52a1\u540c\u4e8b\u786e\u8ba4\n\n 2. \u201c**\u6d41\u91cf\u5927\u7684Redis\u96c6\u7fa4**\u201d\u6807\u51c6\u5b9a\u4e49\uff08\u6ee1\u8db3\u4ee5\u4e0b\u4efb\u4f55\u4e00\u4e2a\u6761\u4ef6\uff09\n\n 1. \u6240\u6709Redis\u8bfb\u6d41\u91cf\u4e4b\u548c>=20MB\n\n 2. \u5355\u4e00Redis\u8fde\u63a5\u6570>=2000\n \u53ef\u4ee5\u901a\u8fc7 info clients\u547d\u4ee4\u67e5\u770b\u5ba2\u6237\u7aef\u8fde\u63a5\uff0c\u6bd4\u5982\n\n `10.15``.``93.70``:``6379``> info clients``# Clients``connected_clients:``2809``client_longest_output_list:``0``client_biggest_input_buf:``0``blocked_clients:``0`\n\n2. **\u6d41\u91cf\u5927**\u7684Redis\u96c6\u7fa4\u4fdd\u8bc1\u5ba2\u6237\u7aef\u5347\u7ea7\u5230\u6700\u65b0\u7248\u672c(CRedis\u5ba2\u6237\u7aefbug\u5bfc\u81f4Redis Server\u8fde\u63a5\u6570\u88ab\u6253\u7206)\n\n 1. java\u5ba2\u6237\u7aef\u7248\u672c 3.0.4 \u4ee5\u4e0a\n 2. .net\u5ba2\u6237\u7aef\u7248\u672c 1.2.5.6 \u4ee5\u4e0a\n\n## \u63a5\u5165\u524d\u914d\u7f6e\uff1a\n\n\u6b64\u90e8\u5206\u975e\u5e38\u91cd\u8981\uff0c\u5426\u5219\u53ef\u80fd\u65e0\u6cd5\u63a5\u5165\u6210\u529f\u3002\n\n\u914d\u7f6e\u4e3b\u8981\u6d89\u53caRedis\u914d\u7f6e\uff0c\u4ee5\u53ca\u670d\u52a1\u5668\u914d\u7f6e\uff0c\u8be6\u60c5\u53c2\u89c1\uff1a\u300a[XPipe\u4f7f\u7528\u6587\u6863](http://conf.ctripcorp.com/pages/viewpage.action?pageId=113945769#XPipe\u4f7f\u7528\u6587\u6863-\u73af\u5883\u51c6\u5907)\u300b \u7ae0\u8282\uff1a\u73af\u5883\u51c6\u5907\n\n## \u63a5\u5165\u6d41\u7a0b\uff1a\n\n### Redis\u63a5\u5165\n\n- \u5b89\u88c5\u5907\u4efd\u673a\u623fRedis\n- \u5728xpipe\u4e0a\u5efa\u7acb\u590d\u5236\u5173\u8054\uff0c\u5e76\u4e14\u786e\u8ba4\u4ece\u673a\u623fRedis\u540c\u6b65\u6210\u529f\n \u5982\u4e0b\u56fe\uff1a\u767b\u5f55XPipe\u7ba1\u7406\u754c\u9762\uff0c\u786e\u8ba4**\u6240\u6709\u8282\u70b9**\u5065\u5eb7\u72b6\u6001\u4e3a\u7eff\u8272\uff1b\u5982\u679c\u4e3a\u7ea2\u8272\uff0c\u4ee3\u8868**\u590d\u5236\u5931\u8d25**\uff1b\n \n- \u5728CRedis\u4e0a\u4fee\u6539**\u539f\u6709Redis\u670d\u52a1\u5668**\u4fe1\u606f\uff0c\u6307\u5b9a\u673a\u623f\u4f4d\u7f6e\n-", "start_char_idx": 0, "end_char_idx": 923, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "9f448401-cda9-4b5f-9a80-c79e111f9963": {"__data__": {"id_": "9f448401-cda9-4b5f-9a80-c79e111f9963", "embedding": null, "metadata": {"file_path": "doc/gitbook/reference/1.5_upgrade_to_xpipe/README.md", "file_name": "README.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "f41ad767777f1af3dbd531eb9ee98ead716942a5", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.5_upgrade_to_xpipe/README.md", "file_name": "README.md"}, "hash": "5f62340bff002103b484740f1f77f7eb1a3f7395e589432209a9f9d19e7e97c2"}, "2": {"node_id": "13221de7-6c68-4367-b1be-f35b06fc3a74", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.5_upgrade_to_xpipe/README.md", "file_name": "README.md"}, "hash": "9b7fb2ce526aee97b401a041522ea93ee4de403abd843dd8c53d67e4ccc56940"}, "3": {"node_id": "3bc7dfc2-3ddf-4384-a60c-6cd52e1314f4", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.5_upgrade_to_xpipe/README.md", "file_name": "README.md"}, "hash": "90115a8077eec7148edb40e75dd2791ecf2e5aa26c9fbc405feba29045c988e9"}}, "hash": "b0946d21f3e36bf5af5d142e4e0b39e0f18bb3dfdab97906c3becd49ba7cc1a2", "text": "\u5728CRedis\u4e0a\u589e\u52a0\u5907\u673a\u623fRedis\u5730\u5740\uff0cRedis\u72b6\u6001\u4e3a\u201c\u65e0\u6548\u201d\uff0c\u673a\u623f\u4e3a\u6240\u5728\u673a\u623f\n <img src=\"/Users/fints/p/java/x-pipe/doc/gitbook/reference/1.5_upgrade_to_xpipe/2.png\" style=\"zoom:50%;\" />\n- \u4fee\u6539cluster\u4fe1\u606f\n - \u591aIDC\uff1a\u201c\u542f\u7528\u201d\n - \u4e3bIDC\u4f4d\u7f6e\u8bf7\u9009\u62e9\uff1a**Redis master\u6240\u5728\u7684\u673a\u623f**\n - \u8def\u7531\u89c4\u5219\uff1a\u201c\u5199master\uff0c\u8bfb\u4e3b\u673a\u623fslave\u201d\n\n<img src=\"/Users/fints/p/java/x-pipe/doc/gitbook/reference/1.5_upgrade_to_xpipe/3.png\" style=\"zoom:33%;\" />\n\n- \u4fee\u6539\u4ece\u673a\u623fRedis\uff0c\u72b6\u6001\u4e3a\u201c\u6709\u6548\u201d\uff0c\u201c\u53ef\u8bfb\u201d\n <img src=\"/Users/fints/p/java/x-pipe/doc/gitbook/reference/1.5_upgrade_to_xpipe/4.png\" style=\"zoom:50%;\" />\n- \u4fee\u6539\u4e3b\u673a\u623fmaster\u793a\u4f8b\uff0c\u72b6\u6001\u53ef\u8bfb\n \u5982\u679c\u8def\u7531\u89c4\u5219\u4e3a\u8bfb\u4e3b\u673a\u623fslave\uff0c\u5373\u4f7f\u914d\u7f6e\u4e3a\u53ef\u8bfb\uff0c\u9ed8\u8ba4\u4e5f\u4e0d\u4f1a\u8bfb\u53d6master\n \u4fee\u6539\u539f\u56e0\uff1a\n \u4fdd\u8bc1\u5728\u5207\u6362\u673a\u623f\u8fc7\u7a0b\u4e2d\uff0c\u6709slave\u53ef\u4ee5\u8fdb\u884c\u8bfb\u53d6\n\n### sentinel\u76f8\u5173\n\n- \u5728XPipe\u7684Console\u4e0a\u9762\u65b0\u589eshard\u65f6\uff0c\u9700\u8981\u9009\u62e9\u6bcf\u4e2a\u673a\u623f\u5bf9\u5e94\u7684\u54e8\u5175\u5730\u5740\uff0c\u5982\u4e0b\u6240\u793a\uff1a\n <img src=\"/Users/fints/p/java/x-pipe/doc/gitbook/reference/1.5_upgrade_to_xpipe/5.png\" style=\"zoom:40%;\" />\n- \u9009\u62e9\u54e8\u5175\u540e\uff0cXPipe\u4f1a\u81ea\u52a8\u8fdb\u884c\u54e8\u5175\u7684\u589e\u5220\u64cd\u4f5c\n\n## DR\u6f14\u7ec3\u6d41\u7a0b\n\n\u5047\u8bbe\u96c6\u7fa4cluster1\uff0c\u4e3b\u673a\u623f\u5728\u91d1\u6865\n\n- \u5907\u4efd\u91d1\u6865\u673a\u623f\u6570\u636e\u3010\u91cd\u8981\uff0c\u5207\u6362\u540e\u5f02\u5e38\u60c5\u51b5\u53ef\u4ee5\u56de\u6eda\u3011\n\n- \u5728XPipe\u4e0a\u64cd\u4f5c\uff0c\u5c06\u96c6\u7fa4\u4ece\u91d1\u6865\u5207\u6362\u5230\u6b27\u9633\n\n- \u89c2\u5bdf\u4e1a\u52a1OK\n\n- \u5982\u679c\u91d1\u6865Redis-Server\u7248\u672c\u975eXRedis\u7248\u672c\uff08\u662f\u7684\u8bdd\n\n \u8df3\u8fc7\n\n \u6b64\u6b65\u9aa4\uff09\n\n - \u786e\u8ba4\u8def\u7531\u7b56\u7565\u4e3a\u201c\u5199master\uff0c\u8bfb\u4e3b\u673a\u623fslave\u201d\u6216\u8005\u201c\u8bfb\u5199master\u201d\n - \u5173\u95ed\u91d1\u6865Redis\n -", "start_char_idx": 924, "end_char_idx": 1918, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "3bc7dfc2-3ddf-4384-a60c-6cd52e1314f4": {"__data__": {"id_": "3bc7dfc2-3ddf-4384-a60c-6cd52e1314f4", "embedding": null, "metadata": {"file_path": "doc/gitbook/reference/1.5_upgrade_to_xpipe/README.md", "file_name": "README.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "f41ad767777f1af3dbd531eb9ee98ead716942a5", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.5_upgrade_to_xpipe/README.md", "file_name": "README.md"}, "hash": "5f62340bff002103b484740f1f77f7eb1a3f7395e589432209a9f9d19e7e97c2"}, "2": {"node_id": "9f448401-cda9-4b5f-9a80-c79e111f9963", "node_type": null, "metadata": {"file_path": "doc/gitbook/reference/1.5_upgrade_to_xpipe/README.md", "file_name": "README.md"}, "hash": "b0946d21f3e36bf5af5d142e4e0b39e0f18bb3dfdab97906c3becd49ba7cc1a2"}}, "hash": "90115a8077eec7148edb40e75dd2791ecf2e5aa26c9fbc405feba29045c988e9", "text": " - \u5173\u95ed\u91d1\u6865Redis\n - \u5728XPipe\u4e0a\u66ff\u6362\u91d1\u6865Redis\u5730\u5740\u4e3aXRedis\u5730\u5740\n - \u5728CRedis\u4e0a\u4fee\u6539\u91d1\u6865Redis\u5730\u5740\u4e3aXRedis\u5730\u5740\uff08\u539f\u6765\u7684Redis**\u5730\u5740\u5fc5\u987b\u5220\u9664**\uff0c\u4e0d\u80fd\u4ee5\u201c\u65e0\u6548\u201d\u7684\u72b6\u6001\u5b58\u5728\uff09\n - \u89c2\u5bdfXPipe\u540c\u6b65\u72b6\u6001OK\n <img src=\"/Users/fints/p/java/x-pipe/doc/gitbook/reference/1.5_upgrade_to_xpipe/6.png\" style=\"zoom:33%;\" />\n\n- \u56de\u5207\uff0c\u5c06\u96c6\u7fa4\u4ece\u6b27\u9633\u5207\u6362\u5230\u91d1\u6865\n\n- \u89c2\u5bdf\u4e1a\u52a1OK\n\n- DR\u6f14\u7ec3\u7ed3\u675f\n\n## DR\u5207\u6362\n\n- \u8bbf\u95ee\n\n http://xpipe.ctripcorp.com/\n\n - \u5982\u679cXPipe Console\u6240\u5728\u673a\u623f\u6302\u6389\uff0c\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539**\u672c\u673ahosts\u6587\u4ef6\u7ed1\u5b9a**\u7279\u5b9aIP\u7684\u65b9\u5f0f\u8bbf\u95ee\u53e6\u5916\u4e00\u4e2a\u673a\u623f\u7684\u670d\u52a1\u5668\n - \u91d1\u6865\u673a\u623f\u670d\u52a1\u5668\uff1a\n - 10.8.151.22 [xpipe.ctripcorp.com](http://xpipe.ctripcorp.com/)\n - \u6b27\u9633\u673a\u623f\u670d\u52a1\u5668\uff1a\n - 10.15.206.22 [xpipe.ctripcorp.com](http://xpipe.ctripcorp.com/)", "start_char_idx": 1902, "end_char_idx": 2460, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "ce3e530c-ce2d-4f5f-a171-72a790c3c624": {"__data__": {"id_": "ce3e530c-ce2d-4f5f-a171-72a790c3c624", "embedding": null, "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "ba41983c476af94547f89d0d3cc420e73f90c9f4", "node_type": null, "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}, "hash": "ee1a39527e8a6688288ac04bcd0485b4a225947095b37da81f46408d3c38569f"}, "3": {"node_id": "85f764bd-e560-48ba-a51e-2287b6fe19db", "node_type": null, "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}, "hash": "a7a8b4ca2b088d52b7e4f4d9c722f7779ce034c1a1a34e1499dda57a76f058f8"}}, "hash": "66c9129880cbf5fdf11f034c4fa1158581f12162d984889f75290fe68d1cbd35", "text": "# \u8de8\u516c\u7f51\u540c\u6b65\u5b9e\u65bd\u6587\u6863\n\n## \u80cc\u666f\nRedis\u7684\u6570\u636e\u5fc5\u987b\u8de8\u516c\u7f51\u8fdb\u884c\u4f20\u8f93\u65f6\uff0c\u5185\u7f51\u4e0e\u516c\u7f51\u8fdb\u884c\u8fde\u63a5\u4f20\u8f93\u5927\u91cf\u6570\u636e\uff0c\u516c\u7f51\u7684\u4e0d\u7a33\u5b9a\u6027\uff0c\u4e0d\u5b89\u5168\u6027\u5728\u4e00\u5b9a\u7a0b\u5ea6\u4e0a\u51b3\u5b9a\u4e86\uff0c\u4f7f\u7528 redis \u76f4\u8fde\u8fdb\u884c\u540c\u6b65\u662f\u4e00\u9879\u4e0d\u63a8\u8350\u7684\u65b9\u6848\u3002\n\n\u901a\u8fc7\u642d\u5efa\u4e13\u7ebf\uff0c\u53ef\u4ee5\u89e3\u51b3\u4e0a\u8ff0\u95ee\u9898\uff0c\u4f46\u662f\u4e00\u65b9\u9762\uff0c\u4e13\u7ebf\u7684\u8d39\u7528\u6602\u8d35; \u53e6\u4e00\u65b9\u9762\uff0c\u4e13\u7ebf\u8fd9\u79cd\u89e3\u51b3\u65b9\u6848\u7684\u53ef\u62d3\u5c55\u6027\u5f88\u5dee\uff0c\u6bcf\u589e\u52a0\u4e00\u4e2a\u7ad9\u70b9\uff0c\u5c31\u9700\u8981\u4e13\u95e8\u5f00\u901a\u4e00\u6761\u7ebf\u8def\u3002\n\n\u57fa\u4e8e\u6b64\uff0c\u6211\u4eec\u51b3\u5b9a\u4f7f\u7528TCP Proxy\u7684\u65b9\u6848\u6765\u89e3\u51b3Redis \u6570\u636e\u8de8\u516c\u7f51\u540c\u6b65\u7684\u95ee\u9898\u3002\u5177\u4f53\u9879\u76ee\u4ee3\u7801\u5728 xpipe \u7684 proxy \u6587\u4ef6\u5939\u4e0b\u9762\uff0cXPipe Proxy \u96c6\u4e2d\u4e86\u52a0\u5bc6\uff0c\u538b\u7f29\u7684\u529f\u80fd\uff0c\u540c\u65f6\uff0c\u6211\u4eec\u63d0\u4f9b\u4e86\u5bf9TCP\u7b97\u6cd5\u7684\u4f18\u5316\u65b9\u6848, \u53ef\u4ee5\u4f7f\u5f97\u516c\u7f51\u4f20\u8f93\u80fd\u591f\u652f\u6301\u66f4\u5927\u7684\u5e26\u5bbd\u3002\n\nProxy \u8fde\u63a5\u5173\u7cfb\u5982\u4e0b\u56fe:\n\n\n## \u8de8\u516c\u7f51\u90e8\u7f72\u67b6\u6784\nXPipe \u7684\u7ec4\u4ef6\u4e2d, \u6309\u7167\u6bcf\u4e2a\u6570\u636e\u4e2d\u5fc3/\u7ad9\u70b9 \u5212\u5206, \u9700\u6c42\u5173\u7cfb\u5982\u4e0b:\n\n1. console \u53ef\u4ee5\u5355\u7ad9\u70b9\u90e8\u7f72, \u4e5f\u53ef\u4ee5\u591a\u7ad9\u70b9\u90e8\u7f72\n2. meta-server \u6bcf\u4e2a\u7ad9\u70b9\u81f3\u5c11\u6709\u4e00\u53f0\n3. keeper-container \u6bcf\u4e2a\u7ad9\u70b9\u81f3\u5c11\u6709\u4e24\u53f0\n4. proxy \u6bcf\u4e2a\u7ad9\u70b9\u81f3\u5c11\u6709\u4e00\u53f0\n\n\u5982\u4e0b\u56fe\u6240\u793a:\n\n\n## \u5b9e\u65bd\u6b65\u9aa4\n> \u5047\u8bbe\u524d\u63d0\u662f\u7528\u6237\u5df2\u7ecf\u5c06\u81ea\u5df1\u7684XPipe\u7cfb\u7edf\u57fa\u672c\u642d\u5efa\u8d77\u6765, \u6216\u8005\u7528\u6237\u5df2\u7ecf\u642d\u5efa\u6210\u529f\u5185\u7f51\u7684XPipe, \u9700\u8981\u589e\u52a0\u8de8\u516c\u7f51\u4f20\u8f93\u7684\u529f\u80fd, \u8bf7\u53c2\u7167\u4e0b\u9762\u6b65\u9aa4\u642d\u5efa\n> \n\n###", "start_char_idx": 0, "end_char_idx": 725, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "85f764bd-e560-48ba-a51e-2287b6fe19db": {"__data__": {"id_": "85f764bd-e560-48ba-a51e-2287b6fe19db", "embedding": null, "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "ba41983c476af94547f89d0d3cc420e73f90c9f4", "node_type": null, "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}, "hash": "ee1a39527e8a6688288ac04bcd0485b4a225947095b37da81f46408d3c38569f"}, "2": {"node_id": "ce3e530c-ce2d-4f5f-a171-72a790c3c624", "node_type": null, "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}, "hash": "66c9129880cbf5fdf11f034c4fa1158581f12162d984889f75290fe68d1cbd35"}, "3": {"node_id": "3a8e4c7c-9f7d-4735-93e7-9d847cff98de", "node_type": null, "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}, "hash": "5d29ed1e9b917ef331ae837a77dc4b37c9d74e35907d534dc09b96bb70c8a83f"}}, "hash": "a7a8b4ca2b088d52b7e4f4d9c722f7779ce034c1a1a34e1499dda57a76f058f8", "text": "\n\n### \u5173\u4e8e\u914d\u7f6e\u9879\n\u7528\u6237\u9700\u8981\u81ea\u5df1\u6839\u636e\u9700\u6c42\u8fdb\u884c\u914d\u7f6e\u9879\u8c03\u6574, \u4e0b\u9762\u5c31\u6bcf\u4e00\u9879\u8fdb\u884c\u8bf4\u660e:\n\u914d\u7f6e\u6587\u4ef6\u5728 config/xpipe.properties \u4e2d\n\n#### Basic\n\n```\nproxy.frontend.tcp.port = 80 proxy \u7684\u5185\u7f51\u7aef\u53e3\nproxy.frontend.tls.port = 443 proxy \u5bf9\u516c\u7f51\u7684\u7aef\u53e3, \u516c\u7f51\u7aef\u53e3\u63d0\u4f9b\u538b\u7f29\u52a0\u5bc6\u529f\u80fd, \u5185\u90e8\u901a\u8baf(\u5185\u7f51\u5219\u4e0d\u7528)\n\n\u4ee5\u4e0b\u4e3a open ssl \u8bc1\u4e66\u7684\u914d\u7f6e\u9879, \u6309\u7167\u81ea\u5df1\u9700\u6c42\u914d\u7f6e\nproxy.root.file.path = /opt/data/openssl/ca.crt\nproxy.server.cert.chain.file.path = /opt/data/openssl/server.crt\nproxy.client.cert.chain.file.path = /opt/data/openssl/client.crt\nproxy.server.key.file.path = /opt/data/openssl/pkcs8_server.key\nproxy.client.key.file.path = /opt/data/openssl/pkcs8_client.key\n\n\u538b\u7f29\u7b97\u6cd5\u4f7f\u7528ZSTD\u7b97\u6cd5, \u9664\u975e\u81ea\u5df1\u6709\u9700\u8981, \u53ef\u4ee5\u81ea\u5df1\u6539\u4ee3\u7801\nproxy.response.timeout = 1000\nproxy.compress.algorithm = ZSTD\nproxy.compress.algorithm.version = 1.0\n\n\n```\n\n#### Advanced\n\n```\nproxy.no.tls.netty.handler = false \u516c\u7f51\u4e0d\u52a0\u5bc6\u7684\u8bdd, \u914d\u7f6e\u4e3a true\nproxy.internal.network.prefix = 192.168 \u5185\u7f51IP Prefix, \u9632\u6b62\u5916\u90e8IP\u94fe\u63a5 proxy \u7684\u5185\u7f51\u7aef\u53e3 (\u56e0\u4e3a\u5185\u7f51\u7aef\u53e3\u662f\u4e0d\u7ecf\u8fc7\u52a0\u5bc6\u7684)\nproxy.recv.buffer.size = 4096 netty \u63a5\u6536 buffer \u5927\u5c0f\u53c2\u6570, \u9664\u975e\u5bf9 netty \u7279\u522b\u719f\u6089, \u4e0d\u8981\u8f7b\u6613\u4fee\u6539\u8fd9\u4e2a\u53c2\u6570\nproxy.monitor.start = true \u662f\u5426\u542f\u7528 proxy \u76d1\u63a7, \u5982\u679c\u6ca1\u6709\u76d1\u63a7\u7cfb\u7edf\u53ef\u4ee5\u5173\u6389, \u8bbe\u7f6e\u4e3a false\n```\n\n#### Optional\n\n```\nproxy.endpoint.check.interval.sec = 2 proxy \u5bf9 proxy \u534f\u8bae\u4e2d\u4e0b\u4e00\u8df3\u7684\u70b9\u8fdb\u884c\u5065\u5eb7\u76d1\u6d4b\u7684\u95f4\u9694, \u53ef\u4ee5\u4e0d\u7528\u8c03\u6574\nproxy.traffic.report.interval.milli = 5000 xpipe \u5411CAT\u6253\u7684\u76d1\u63a7\u57cb\u70b9, \u53ef\u4ee5\u5ffd\u7565\n```\n\n### TCP\u4f18\u5316\n\u5728\u542f\u52a8\u4e4b\u524d, \u9700\u8981\u4f7f\u7528BBR\u7b97\u6cd5\u66ff\u6362 Linux \u9ed8\u8ba4\u7684 cubic \u7b97\u6cd5:\n\n\u6587\u7ae0\uff1ahttps://www.vultr.com/docs/how-to-deploy-google-bbr-on-centos-7\n ", "start_char_idx": 721, "end_char_idx": 2037, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "3a8e4c7c-9f7d-4735-93e7-9d847cff98de": {"__data__": {"id_": "3a8e4c7c-9f7d-4735-93e7-9d847cff98de", "embedding": null, "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "ba41983c476af94547f89d0d3cc420e73f90c9f4", "node_type": null, "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}, "hash": "ee1a39527e8a6688288ac04bcd0485b4a225947095b37da81f46408d3c38569f"}, "2": {"node_id": "85f764bd-e560-48ba-a51e-2287b6fe19db", "node_type": null, "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}, "hash": "a7a8b4ca2b088d52b7e4f4d9c722f7779ce034c1a1a34e1499dda57a76f058f8"}, "3": {"node_id": "af881b61-03f4-4851-8946-794015e3436c", "node_type": null, "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}, "hash": "4a978c55891b04b732b10b771b7ea05b85f66025767ea4fd39b1fdf9887c315b"}}, "hash": "5d29ed1e9b917ef331ae837a77dc4b37c9d74e35907d534dc09b96bb70c8a83f", "text": " \n\u4e0b\u8f7d\u5185\u6838\u5b89\u88c5\u5305\uff1ahttp://mirror.rc.usf.edu/compute_lock/elrepo/kernel/el7/x86_64/RPMS/kernel-ml-4.9.0-1.el7.elrepo.x86_64.rpm \n\n``` \nrpm -ivh XXX \nrpm -qa | grep kernel\nsudo egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d \\'\nsudo grub2-set-default 0 # \u8fd9\u91cc0\u9700\u6839\u636e\u4e0a\u4e2a\u547d\u4ee4\u8f93\u51fa\u7ed3\u679c\u800c\u5b9a\nsudo shutdown -r now\nuname -r\n\n\necho 'net.core.default_qdisc=fq' | sudo tee -a /etc/sysctl.conf\necho 'net.ipv4.tcp_congestion_control=bbr' | sudo tee -a /etc/sysctl.conf\nsudo sysctl -p\n```\n\n### Java \u542f\u52a8TCP\u572880\u7aef\u53e3\n\n```\nsetcap 'cap_net_bind_service=+ep' $JAVE_HOME/bin/java\n```\n\n### \u521d\u59cb\u5316\u811a\u672c\n\nredis/redis-proxy/src/main/test/resources\u4e0b\u5305\u542bcert\u548cenv_set\u6587\u4ef6\u5939\uff0c\u5c062\u4e2a\u6587\u4ef6\u5939\u590d\u5236\u5230Proxy\u673a\u5668\u4e0a\uff0c\u5728\u5b8c\u6210\u5185\u6838\u624b\u52a8\u5347\u7ea7\u540e\uff0c\u6267\u884c\u5982\u4e0b\u547d\u4ee4\u5b8c\u6210\u673a\u5668\u521d\u59cb\u5316\u3002\n```\nsudo bash init.sh && sudo bash refresh.sh\n```\n\n### \u6570\u636e\u5e93\u63d2\u5165\u4fe1\u606f\n\n#### proxy\u8282\u70b9\u7684\u63d2\u5165\n\u901a\u8fc7\u8c03\u7528 console api, \u53ef\u4ee5\u5b8c\u6210 proxy \u8282\u70b9\u7684\u63d2\u5165:\nurl: `http://{xpipe-url}/api/proxy`\nmethod: `POST`\u6dfb\u52a0/`PUT`\u4fee\u6539\nbody:\n```\n{\n\t\"uri\": \"192.168.0.1:80\",\n\t\"dcName\": \"jq\",\n\t\"active\": true,\n\t\"monitorActive\": false\n}\n```\n\n#### route\u8282\u70b9\u7684\u63d2\u5165\n> route \u5b9a\u4e49\u4e86 proxy \u548c proxy \u4e4b\u524d\u7684\u94fe\u63a5, \u7528\u6237\u901a\u8fc7\u6dfb\u52a0 route, \u6765\u63a7\u5236\u4e0d\u540c\u7ad9\u70b9\u4e4b\u95f4\u7684\u8bbf\u95ee\u8def\u5f84\n\n\u901a\u8fc7\u8c03\u7528 console api, \u53ef\u4ee5\u5b8c\u6210 route \u8282\u70b9\u7684\u63d2\u5165:\nurl: `http://{xpipe-url}/api/route`\nmethod: `POST`\u6dfb\u52a0/`PUT`\u4fee\u6539\nbody:\n```\n{\n\t\"srcProxyIds\": \"1,2,3\", //\u6e90\u5730\u5740\u7684 proxy id \u5217\u8868, \u9017\u53f7\u95f4\u9694\n\t\"dstProxyIds\": \"4,5,6\", //\u76ee\u7684\u5730\u7684 proxy id \u5217\u8868, \u9017\u53f7\u95f4\u9694\n\t\"optionProxyIds\": \"\", //proxy \u652f\u6301\u4e2d\u95f4\u8df3\u8f6c, \u5982\u679c\u6ca1\u6709\u5fc5\u8981, \u53ef\u4ee5\u4e0d\u586b\n\t\"srcDcname\": \"jq\", //\u6e90\u673a\u623f\u540d\u79f0, \u6821\u9a8c\u4fe1\u606f\u65f6\u4f1a\u4f7f\u7528\n\t\"dstDcname\": \"oy\", //\u76ee\u6807\u673a\u623f\u540d\u79f0,", "start_char_idx": 2043, "end_char_idx": 3410, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "af881b61-03f4-4851-8946-794015e3436c": {"__data__": {"id_": "af881b61-03f4-4851-8946-794015e3436c", "embedding": null, "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "ba41983c476af94547f89d0d3cc420e73f90c9f4", "node_type": null, "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}, "hash": "ee1a39527e8a6688288ac04bcd0485b4a225947095b37da81f46408d3c38569f"}, "2": {"node_id": "3a8e4c7c-9f7d-4735-93e7-9d847cff98de", "node_type": null, "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}, "hash": "5d29ed1e9b917ef331ae837a77dc4b37c9d74e35907d534dc09b96bb70c8a83f"}, "3": {"node_id": "31579820-439e-4029-b8c4-a0d6528daa59", "node_type": null, "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}, "hash": "3a655b7e1aa51b85fba8005ad63ade295e0e7ef9684b2b33825cb79f37a230d6"}}, "hash": "4a978c55891b04b732b10b771b7ea05b85f66025767ea4fd39b1fdf9887c315b", "text": " //\u76ee\u6807\u673a\u623f\u540d\u79f0, \u6821\u9a8c\u4fe1\u606f\u65f6\u4f1a\u4f7f\u7528\n\t\"tag\": \"meta\"\n}\n```\n\n\u7279\u522b\u6ce8\u610f \"tag\" \u8fd9\u4e00\u9879\u5b9e\u9645\u63a7\u5236\u4e86 route \u7684\u7528\u9014, \u76ee\u524d\u652f\u6301\u4e24\u79cd tag\n`meta` \u6216\u8005 `console`\n`meta` \u662f keeper \u4e4b\u95f4\u7528\u6765\u540c\u6b65\u7684, meta server \u5bf9\u4e0d\u540c\u7684\u6807\u8bb0\u4e3a`meta`\u7684\u8def\u7531\u8fdb\u884c\u9009\u62e9, \u53d1\u9001\u7ed9 keeper, \u544a\u77e5\u5177\u4f53\u8def\u5f84\n`console` \u662f\u4e3a\u4e86 console \u8de8\u516c\u7f51\u5bf9 redis \u505a\u5065\u5eb7\u68c0\u6d4b\u65f6, \u9700\u8981\u7ecf\u8fc7 proxy \u8f6c\u53d1\n\n\n### \u5c0f\u7ed3\n\u5230\u6b64, \u7528\u6237\u53ef\u4ee5\u4f7f\u7528 proxy \u63d0\u4f9b\u7684\u8de8\u516c\u7f51\u4f20\u8f93\u7684\u529f\u80fd, \u643a\u7a0b\u76ee\u524d\u4f7f\u7528 proxy \u8fdb\u884c\u4ece\u4e0a\u6d77\u5230\u5fb7\u56fd\u7684\u6570\u636e\u4f20\u8f93, \u7a33\u5b9a\u6027\u548c\u5b89\u5168\u6027\u90fd\u7ecf\u8fc7\u751f\u4ea7\u73af\u5883\u7684\u68c0\u9a8c\n\n# Proxy \u6574\u4f53\u8bbe\u8ba1\n\n\nproxy \u4f1a\u572880\u548c443\u5206\u522b\u542f\u52a8\u670d\u52a1\uff0c80\u7aef\u53e3\u670d\u52a1\u5185\u7f51\u8fde\u63a5\uff0c443\u7aef\u53e3\u670d\u52a1\u5916\u7f51\u8fde\u63a5\u3002\n\n## \u6838\u5fc3\u6982\u5ff5\n\n### Tunnel\n\u7f51\u7edc\u96a7\u9053\uff0c\u96a7\u9053\u6709\u5165\u53e3\u548c\u51fa\u53e3\uff0c\u5206\u522b\u6620\u5c04\u5230\u5185\u7f51\u548c\u5916\u7f51\uff0c\u6240\u4ee5 Tunnel \u7684\u4f5c\u7528\u5c31\u662f\u5c06 \u5185\u7f51/\u5916\u7f51 \u6d41\u91cf\u8f6c\u5230 \u5916\u7f51/\u5185\u7f51\u3002\n\n### Session\n\u4e00\u6bb5\u8fde\u63a5\u56de\u8bdd\uff0c\u5177\u6709\u751f\u547d\u5468\u671f\uff0c\u5305\u542bInit\u3001Established\u3001Closing\u548cClosed\u3002\n\n### ProxyProtocol\n\u4e3a\u4e86\u4fdd\u8bc1 proxy \u672c\u8eab\u662f\u65e0\u72b6\u6001\u7684\uff0c\u4f7f\u7528 proxy \u7684 client \u9700\u8981\u5c06\u6574\u6761\u94fe\u8def\u4e0a\u7ecf\u8fc7\u7684\u6240\u6709 proxy \u4e0e server \u7684 IP \u548c\u7aef\u53e3\u4f5c\u4e3a\u4e00\u6761\u4fe1\u606f\u53d1\u9001\u7ed9\u8fde\u63a5\u7684 proxy\uff0c\u6b64\u6761\u6d88\u606f\u5373 proxy \u534f\u8bae\u4e2d route \u4fe1\u606f\u3002\n\n\u6570\u636e\u5728\u516c\u7f51\u4f20\u8f93\u65f6\uff0cproxy \u9700\u8981\u8fdb\u884c ssl \u52a0\u5bc6\uff0c\u4f7f\u7528443\u7aef\u53e3\uff0c\u5728 proxy \u534f\u8bae\u4e2d URI \u4e3a PROXYTLS:\u540e\u63a5IP\u4e0e\u7aef\u53e3\uff0c\u5373 PROXYTLS:IP:443\uff1b\n\n\u800c\u5728\u5185\u7f51\u4f20\u8f93\u65f6\uff0c\u4e0d\u5fc5\u8fdb\u884c ssl \u52a0\u5bc6\uff0c\u4f7f\u752880\u7aef\u53e3\uff0c\u5728 proxy \u534f\u8bae\u4e2d URI \u4e3a TCP:\u540e\u63a5IP\u4e0e\u7aef\u53e3\uff0c\u5373", "start_char_idx": 3402, "end_char_idx": 4238, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}, "31579820-439e-4029-b8c4-a0d6528daa59": {"__data__": {"id_": "31579820-439e-4029-b8c4-a0d6528daa59", "embedding": null, "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}, "excluded_embed_metadata_keys": [], "excluded_llm_metadata_keys": [], "relationships": {"1": {"node_id": "ba41983c476af94547f89d0d3cc420e73f90c9f4", "node_type": null, "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}, "hash": "ee1a39527e8a6688288ac04bcd0485b4a225947095b37da81f46408d3c38569f"}, "2": {"node_id": "af881b61-03f4-4851-8946-794015e3436c", "node_type": null, "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}, "hash": "4a978c55891b04b732b10b771b7ea05b85f66025767ea4fd39b1fdf9887c315b"}}, "hash": "3a655b7e1aa51b85fba8005ad63ade295e0e7ef9684b2b33825cb79f37a230d6", "text": "TCP:IP:80\u3002\n\nURI\u6784\u6210\u683c\u5f0f\u5982\u4e0b\u6240\u793a\uff1a\n\n\n\n# Proxy Client\nredis-proxy-client \u5ba2\u6237\u7aef\u63d0\u4f9b\u4e86\u4f4e\u4fb5\u5165 proxy \u63a5\u5165\u65b9\u5f0f\uff0c\u7528\u6237\u6ce8\u518c\u9700\u8981\u4ee3\u7406\u7684\u7ec8\u7aef\uff0c\u8fd0\u884c\u65f6\u5ba2\u6237\u7aef\u81ea\u52a8\u62e6\u622a\u5efa\u8fde\u8bf7\u6c42\uff0c\u5b8c\u6210 proxy \u901a\u4fe1\u534f\u8bae\uff0c\u5b9e\u73b0\u7528\u6237\u6570\u636e\u4f20\u8f93\u3002\n\n## \u4f7f\u7528\u65b9\u5f0f\n\n### \u5f15\u5165\u4f9d\u8d56\n\n```\n<!-- \u6700\u4f4e\u7248\u672c1.2.4 -->\n<dependency>\n <groupId>com.ctrip.framework.xpipe.redis</groupId>\n <artifactId>redis-proxy-client</artifactId>\n <version>${project.version}</version>\n</dependency>\n```\n\n### \u6ce8\u518c\u4ee3\u7406\u7ec8\u7aef\n\u6ce8\u518c\u9700\u8981\u4ee3\u7406\u7684 (ip, port) \u53ca\u5176\u4f7f\u7528\u7684 proxy \u4fe1\u606f\u5373\u53ef\u3002\n```\nProxyRegistry.registerProxy(\"10.15.1.0\", 8080, \"PROXY ROUTE PROXYTCP://10.26.0.1:80 PROXYTLS://10.15.1.1:443 TCP\")\n\n```\n\u8fd0\u884c\u65f6\uff0ckeeper \u4f1a\u81ea\u52a8\u5efa\u7acb\u5982\u4e0b\u94fe\u8def\uff0cproxy \u5bf9\u7528\u6237\u5b8c\u5168\u900f\u660e\u3002\n\n\n### \u53d6\u6d88\u4ee3\u7406\u7ec8\u7aef\n```\nProxyRegistry.unegisterProxy(\"10.15.1.0\", 8080)\n\n```\n\n## \u5b9e\u73b0\u539f\u7406\nredis-proxy-client \u4f7f\u7528 JavaAgent \u548c ASM \u5b57\u8282\u7801\u6280\u672f\uff0c\u5bf9JVM\u52a0\u8f7d\u7684 Socket.class \u548c SocketChannelImpl.class \u4e8c\u8fdb\u5236\u6587\u4ef6\uff0c\u5229\u7528 ASM \u52a8\u6001\u4fee\u6539\u5bf9\u5e94\u7684 class \u6587\u4ef6\uff0c\u4ee3\u7406\u5b9e\u73b0 proxy \u534f\u8bae\u3002\n\n### Agent\u542f\u52a8\n1. \u4f7f\u7528 Tomcat \u5bb9\u5668\u7684\u542f\u52a8 war \u5305\u7684\u5e94\u7528\uff0c\u901a\u8fc7 ServletContextListener \u5b9e\u73b0 Agent \u7684\u81ea\u52a8\u542f\u52a8\uff1b\n2. \u4f7f\u7528 Spring Boot \u542f\u52a8 jar \u5305\u7684\u5e94\u7528\uff0c\u901a\u8fc7 EnableAutoConfiguration \u5b9e\u73b0 Agent \u7684\u81ea\u52a8\u542f\u52a8;\n3. \u975e\u4ee5\u4e0a2\u79cd\u65b9\u5f0f\uff0c\u53ef\u4ee5\u4e3b\u52a8\u6267\u884c ProxyAgentTool.startUp() \u542f\u52a8 Agent\u3002\n\n\u5bf9\u4e8e jdk >= 9 \u7684\u5e94\u7528\uff0c\u9700\u6dfb\u52a0\u5982\u4e0b VM \u53c2\u6570\uff1a\n```\n-Djdk.attach.allowAttachSelf=true\n```", "start_char_idx": 4248, "end_char_idx": 5348, "text_template": "{metadata_str}\n\n{content}", "metadata_template": "{key}: {value}", "metadata_seperator": "\n"}, "__type__": "1"}}, "docstore/ref_doc_info": {"59c5fcb6fbc3fb59706aa803f8303063eecb5f6a": {"node_ids": ["59108663-a5e1-4e3e-bb21-626158eef136", "50de4ec9-febb-466f-9f9a-cc9296895e83", "aa413a53-0dda-4ac4-8ae9-6e8e340bb4f0"], "metadata": {"file_path": "doc/design.md", "file_name": "design.md"}}, "87c0a0a03885d1a2f92dd7da09b59a216fe18d1a": {"node_ids": ["a0cc4323-ec8f-4fed-9401-e44125134341"], "metadata": {"file_path": "doc/gitbook/README.md", "file_name": "README.md"}}, "f4e8dea3f4206b83d5a2b728be75904de53a24b5": {"node_ids": ["5321cc7b-2a86-48b8-b56c-415dde7c149b"], "metadata": {"file_path": "doc/gitbook/_sidebar.md", "file_name": "_sidebar.md"}}, "be00460586568a7bdf45d1a4c4df15e223068fd5": {"node_ids": ["9e19fb91-8258-4aca-9692-2d027073499e"], "metadata": {"file_path": "doc/gitbook/reference/1.0_intro/README.md", "file_name": "README.md"}}, "231924dc75127b769db8454825b9599100070419": {"node_ids": ["02e856e5-4211-4a27-9204-e966907f1d74", "f3074870-8fbf-4322-b1d2-2111e6aac9af", "82677fb9-abe3-4038-8263-5576c47da4f2"], "metadata": {"file_path": "doc/gitbook/reference/1.1_why_xpipe/README.md", "file_name": "README.md"}}, "ab72ca168649fc7fbb292dec7495bbeeabde0407": {"node_ids": ["a08364a6-c23d-4df5-8b5d-84137fbebd4e", "e45b082d-c3ec-45aa-b630-6db49a62728b", "2c55445c-04b1-4705-9871-adaa02f38f1b"], "metadata": {"file_path": "doc/gitbook/reference/1.2_how_to_use/README.md", "file_name": "README.md"}}, "350021a40b38746aea78dcf46408053627cc6997": {"node_ids": ["d0de9736-ccad-450e-b4a1-49d4cdb8b941"], "metadata": {"file_path": "doc/gitbook/reference/1.3_oversea_intro/README.md", "file_name": "README.md"}}, "4fdc8892ee752699cbd6e4d4d5f395dfdbcd06eb": {"node_ids": ["fd0d2375-39e2-4bce-8e39-1182a122a1b4"], "metadata": {"file_path": "doc/gitbook/reference/1.4_oversea_how_to_use_for_dba/README.md", "file_name": "README.md"}}, "f41ad767777f1af3dbd531eb9ee98ead716942a5": {"node_ids": ["13221de7-6c68-4367-b1be-f35b06fc3a74", "9f448401-cda9-4b5f-9a80-c79e111f9963", "3bc7dfc2-3ddf-4384-a60c-6cd52e1314f4"], "metadata": {"file_path": "doc/gitbook/reference/1.5_upgrade_to_xpipe/README.md", "file_name": "README.md"}}, "ba41983c476af94547f89d0d3cc420e73f90c9f4": {"node_ids": ["ce3e530c-ce2d-4f5f-a171-72a790c3c624", "85f764bd-e560-48ba-a51e-2287b6fe19db", "3a8e4c7c-9f7d-4735-93e7-9d847cff98de", "af881b61-03f4-4851-8946-794015e3436c", "31579820-439e-4029-b8c4-a0d6528daa59"], "metadata": {"file_path": "doc/proxy.md", "file_name": "proxy.md"}}}}
|
|
|
|
dataset/graph_store.json
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
{"graph_dict": {}}
|
|
|
|
dataset/index_store.json
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
{"index_store/data": {"da495c94-4541-47e1-b93f-8535192a5f28": {"__type__": "vector_store", "__data__": "{\"index_id\": \"da495c94-4541-47e1-b93f-8535192a5f28\", \"summary\": null, \"nodes_dict\": {\"59108663-a5e1-4e3e-bb21-626158eef136\": \"59108663-a5e1-4e3e-bb21-626158eef136\", \"50de4ec9-febb-466f-9f9a-cc9296895e83\": \"50de4ec9-febb-466f-9f9a-cc9296895e83\", \"aa413a53-0dda-4ac4-8ae9-6e8e340bb4f0\": \"aa413a53-0dda-4ac4-8ae9-6e8e340bb4f0\", \"a0cc4323-ec8f-4fed-9401-e44125134341\": \"a0cc4323-ec8f-4fed-9401-e44125134341\", \"5321cc7b-2a86-48b8-b56c-415dde7c149b\": \"5321cc7b-2a86-48b8-b56c-415dde7c149b\", \"9e19fb91-8258-4aca-9692-2d027073499e\": \"9e19fb91-8258-4aca-9692-2d027073499e\", \"02e856e5-4211-4a27-9204-e966907f1d74\": \"02e856e5-4211-4a27-9204-e966907f1d74\", \"f3074870-8fbf-4322-b1d2-2111e6aac9af\": \"f3074870-8fbf-4322-b1d2-2111e6aac9af\", \"82677fb9-abe3-4038-8263-5576c47da4f2\": \"82677fb9-abe3-4038-8263-5576c47da4f2\", \"a08364a6-c23d-4df5-8b5d-84137fbebd4e\": \"a08364a6-c23d-4df5-8b5d-84137fbebd4e\", \"e45b082d-c3ec-45aa-b630-6db49a62728b\": \"e45b082d-c3ec-45aa-b630-6db49a62728b\", \"2c55445c-04b1-4705-9871-adaa02f38f1b\": \"2c55445c-04b1-4705-9871-adaa02f38f1b\", \"d0de9736-ccad-450e-b4a1-49d4cdb8b941\": \"d0de9736-ccad-450e-b4a1-49d4cdb8b941\", \"fd0d2375-39e2-4bce-8e39-1182a122a1b4\": \"fd0d2375-39e2-4bce-8e39-1182a122a1b4\", \"13221de7-6c68-4367-b1be-f35b06fc3a74\": \"13221de7-6c68-4367-b1be-f35b06fc3a74\", \"9f448401-cda9-4b5f-9a80-c79e111f9963\": \"9f448401-cda9-4b5f-9a80-c79e111f9963\", \"3bc7dfc2-3ddf-4384-a60c-6cd52e1314f4\": \"3bc7dfc2-3ddf-4384-a60c-6cd52e1314f4\", \"ce3e530c-ce2d-4f5f-a171-72a790c3c624\": \"ce3e530c-ce2d-4f5f-a171-72a790c3c624\", \"85f764bd-e560-48ba-a51e-2287b6fe19db\": \"85f764bd-e560-48ba-a51e-2287b6fe19db\", \"3a8e4c7c-9f7d-4735-93e7-9d847cff98de\": \"3a8e4c7c-9f7d-4735-93e7-9d847cff98de\", \"af881b61-03f4-4851-8946-794015e3436c\": \"af881b61-03f4-4851-8946-794015e3436c\", \"31579820-439e-4029-b8c4-a0d6528daa59\": \"31579820-439e-4029-b8c4-a0d6528daa59\"}, \"doc_id_dict\": {}, \"embeddings_dict\": {}}"}}}
|
|
|
|
dataset/vector_store.json
DELETED
The diff for this file is too large to render.
See raw diff
|
|
docs/docs.pkl
CHANGED
Binary files a/docs/docs.pkl and b/docs/docs.pkl differ
|
|
github_retriever.py
ADDED
@@ -0,0 +1,63 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from llama_hub.github_repo import GithubRepositoryReader, GithubClient
|
2 |
+
from llama_index import download_loader, GPTVectorStoreIndex
|
3 |
+
from llama_index import LLMPredictor, VectorStoreIndex, ServiceContext
|
4 |
+
from langchain.llms import AzureOpenAI
|
5 |
+
from langchain.embeddings.openai import OpenAIEmbeddings
|
6 |
+
from llama_index import LangchainEmbedding, ServiceContext
|
7 |
+
from llama_index import StorageContext, load_index_from_storage
|
8 |
+
from dotenv import load_dotenv
|
9 |
+
import os
|
10 |
+
import pickle
|
11 |
+
|
12 |
+
|
13 |
+
def main() -> None:
|
14 |
+
# define embedding
|
15 |
+
embedding = LangchainEmbedding(OpenAIEmbeddings(chunk_size=1))
|
16 |
+
# define LLM
|
17 |
+
llm_predictor = LLMPredictor(
|
18 |
+
llm=AzureOpenAI(
|
19 |
+
engine="text-davinci-003",
|
20 |
+
model_name="text-davinci-003",
|
21 |
+
)
|
22 |
+
)
|
23 |
+
|
24 |
+
# configure service context
|
25 |
+
service_context = ServiceContext.from_defaults(
|
26 |
+
llm_predictor=llm_predictor, embed_model=embedding
|
27 |
+
)
|
28 |
+
download_loader("GithubRepositoryReader")
|
29 |
+
docs = None
|
30 |
+
if os.path.exists("docs/docs.pkl"):
|
31 |
+
with open("docs/docs.pkl", "rb") as f:
|
32 |
+
docs = pickle.load(f)
|
33 |
+
|
34 |
+
if docs is None:
|
35 |
+
github_client = GithubClient(os.getenv("GITHUB_TOKEN"))
|
36 |
+
loader = GithubRepositoryReader(
|
37 |
+
github_client,
|
38 |
+
owner="ctripcorp",
|
39 |
+
repo="x-pipe",
|
40 |
+
filter_directories=(
|
41 |
+
[".", "doc"],
|
42 |
+
GithubRepositoryReader.FilterType.INCLUDE,
|
43 |
+
),
|
44 |
+
filter_file_extensions=([".md"], GithubRepositoryReader.FilterType.INCLUDE),
|
45 |
+
verbose=True,
|
46 |
+
concurrent_requests=10,
|
47 |
+
)
|
48 |
+
|
49 |
+
docs = loader.load_data(branch="master")
|
50 |
+
|
51 |
+
with open("docs/docs.pkl", "wb") as f:
|
52 |
+
pickle.dump(docs, f)
|
53 |
+
|
54 |
+
index = GPTVectorStoreIndex.from_documents(docs, service_context=service_context)
|
55 |
+
|
56 |
+
query_engine = index.as_query_engine(service_context=service_context)
|
57 |
+
response = query_engine.query("如何使用X-Pipe?")
|
58 |
+
print(response)
|
59 |
+
|
60 |
+
|
61 |
+
if __name__ == "__main__":
|
62 |
+
load_dotenv()
|
63 |
+
main()
|
{langchain_manager → langchain}/__init__.py
RENAMED
File without changes
|
{langchain_manager → langchain}/manager.py
RENAMED
@@ -1,12 +1,14 @@
|
|
1 |
from abc import abstractmethod, ABC
|
2 |
|
3 |
-
from langchain.base_language import BaseLanguageModel
|
4 |
from langchain.embeddings.base import Embeddings as LCEmbeddings
|
5 |
from langchain.embeddings.openai import OpenAIEmbeddings
|
6 |
from langchain.llms import AzureOpenAI
|
|
|
|
|
|
|
7 |
|
8 |
|
9 |
-
class BaseLangChainManager(ABC):
|
10 |
def __init__(self) -> None:
|
11 |
super().__init__()
|
12 |
|
@@ -22,49 +24,16 @@ class BaseLangChainManager(ABC):
|
|
22 |
class LangChainAzureManager(BaseLangChainManager):
|
23 |
def __init__(self) -> None:
|
24 |
super().__init__()
|
25 |
-
self.embedding = OpenAIEmbeddings(client=None, chunk_size=1)
|
26 |
-
self.llm = AzureOpenAI(
|
27 |
-
deployment_name="text-davinci-003",
|
28 |
-
# model_name="text-davinci-003",
|
29 |
-
model="text-davinci-003",
|
30 |
-
client=None,
|
31 |
-
# temperature set to 0.0(default 0.7) to get a certain answer from OpenAI,
|
32 |
-
# as a wiki robot we won't want to get flexible answers
|
33 |
-
temperature=0.0,
|
34 |
-
# GPT-3 default is 4096, however, openai.py default is 256
|
35 |
-
max_tokens=2048,
|
36 |
-
)
|
37 |
|
38 |
# Override
|
39 |
def get_embedding(self) -> LCEmbeddings:
|
40 |
-
return
|
41 |
|
42 |
# Override
|
43 |
def get_llm(self) -> BaseLanguageModel:
|
44 |
-
return
|
45 |
-
|
46 |
-
|
47 |
-
class LangChainHuggingFaceManager(BaseLangChainManager):
|
48 |
-
def __init__(self) -> None:
|
49 |
-
super().__init__()
|
50 |
-
from transformers import AutoTokenizer, AutoModel
|
51 |
-
|
52 |
-
AutoTokenizer.from_pretrained("GanymedeNil/text2vec-large-chinese")
|
53 |
-
|
54 |
-
AutoModel.from_pretrained("GanymedeNil/text2vec-large-chinese")
|
55 |
-
|
56 |
-
self.embedding = OpenAIEmbeddings(client=None, chunk_size=1)
|
57 |
-
self.llm = AzureOpenAI(
|
58 |
deployment_name="text-davinci-003",
|
59 |
# model_name="text-davinci-003",
|
60 |
model="text-davinci-003",
|
61 |
client=None,
|
62 |
)
|
63 |
-
|
64 |
-
# Override
|
65 |
-
def get_embedding(self) -> LCEmbeddings:
|
66 |
-
return self.embedding
|
67 |
-
|
68 |
-
# Override
|
69 |
-
def get_llm(self) -> BaseLanguageModel:
|
70 |
-
return self.llm
|
|
|
1 |
from abc import abstractmethod, ABC
|
2 |
|
|
|
3 |
from langchain.embeddings.base import Embeddings as LCEmbeddings
|
4 |
from langchain.embeddings.openai import OpenAIEmbeddings
|
5 |
from langchain.llms import AzureOpenAI
|
6 |
+
from langchain.base_language import BaseLanguageModel
|
7 |
+
|
8 |
+
from core.lifecycle import Lifecycle
|
9 |
|
10 |
|
11 |
+
class BaseLangChainManager(Lifecycle, ABC):
|
12 |
def __init__(self) -> None:
|
13 |
super().__init__()
|
14 |
|
|
|
24 |
class LangChainAzureManager(BaseLangChainManager):
|
25 |
def __init__(self) -> None:
|
26 |
super().__init__()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
|
28 |
# Override
|
29 |
def get_embedding(self) -> LCEmbeddings:
|
30 |
+
return OpenAIEmbeddings(client=None, chunk_size=1)
|
31 |
|
32 |
# Override
|
33 |
def get_llm(self) -> BaseLanguageModel:
|
34 |
+
return AzureOpenAI(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
35 |
deployment_name="text-davinci-003",
|
36 |
# model_name="text-davinci-003",
|
37 |
model="text-davinci-003",
|
38 |
client=None,
|
39 |
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
llama/context.py
ADDED
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from llama_index import ServiceContext, LLMPredictor, LangchainEmbedding
|
2 |
+
from type import Optional
|
3 |
+
from core.lifecycle import Lifecycle
|
4 |
+
from langchain.manager import BaseLangChainManager
|
5 |
+
|
6 |
+
|
7 |
+
class ServiceContextManager(Lifecycle):
|
8 |
+
service_context: Optional[ServiceContext]
|
9 |
+
|
10 |
+
def __init__(self, manager: BaseLangChainManager) -> None:
|
11 |
+
super().__init__()
|
12 |
+
self.manager = manager
|
13 |
+
self.service_context = None
|
14 |
+
|
15 |
+
def get_service_context(self) -> ServiceContext:
|
16 |
+
if self.lifecycle_state.is_started():
|
17 |
+
raise KeyError(
|
18 |
+
"incorrect lifecycle state: {}".format(self.lifecycle_state.phase)
|
19 |
+
)
|
20 |
+
if self.service_context is None:
|
21 |
+
raise ValueError(
|
22 |
+
"service context is not ready, check for lifecycle statement"
|
23 |
+
)
|
24 |
+
return self.service_context
|
25 |
+
|
26 |
+
def do_init(self) -> None:
|
27 |
+
# define embedding
|
28 |
+
embedding = LangchainEmbedding(self.manager.get_embedding())
|
29 |
+
# define LLM
|
30 |
+
llm_predictor = LLMPredictor(llm=self.manager.get_llm())
|
31 |
+
# configure service context
|
32 |
+
self.service_context = ServiceContext.from_defaults(
|
33 |
+
llm_predictor=llm_predictor, embed_model=embedding
|
34 |
+
)
|
35 |
+
|
36 |
+
def do_start(self) -> None:
|
37 |
+
pass
|
38 |
+
|
39 |
+
def do_stop(self) -> None:
|
40 |
+
pass
|
41 |
+
|
42 |
+
def do_dispose(self) -> None:
|
43 |
+
pass
|
44 |
+
|
45 |
+
|
46 |
+
class StorageContextManager(Lifecycle):
|
47 |
+
def __init__(self, dataset_path: Optional[str] = "./dataset") -> None:
|
48 |
+
super().__init__()
|
49 |
+
self.dataset_path = dataset_path
|
50 |
+
|
51 |
+
def do_init(self) -> None:
|
52 |
+
pass
|
53 |
+
|
54 |
+
def do_start(self) -> None:
|
55 |
+
pass
|
56 |
+
|
57 |
+
def do_stop(self) -> None:
|
58 |
+
pass
|
59 |
+
|
60 |
+
def do_dispose(self) -> None:
|
61 |
+
pass
|
llama/data_loader.py
CHANGED
@@ -7,6 +7,8 @@ from llama_hub.github_repo import GithubRepositoryReader, GithubClient
|
|
7 |
from llama_index import download_loader
|
8 |
from llama_index.readers.schema.base import Document
|
9 |
|
|
|
|
|
10 |
|
11 |
class WikiLoader(ABC):
|
12 |
@abstractmethod
|
@@ -14,7 +16,7 @@ class WikiLoader(ABC):
|
|
14 |
pass
|
15 |
|
16 |
|
17 |
-
class GithubLoader(WikiLoader):
|
18 |
def __init__(
|
19 |
self,
|
20 |
github_owner: Optional[str] = None,
|
@@ -51,8 +53,7 @@ class GithubLoader(WikiLoader):
|
|
51 |
verbose=True,
|
52 |
concurrent_requests=10,
|
53 |
)
|
54 |
-
|
55 |
-
os.environ["https_proxy"] = "http://127.0.0.1:7890"
|
56 |
docs = loader.load_data(branch="master")
|
57 |
|
58 |
with open("docs/docs.pkl", "wb") as f:
|
|
|
7 |
from llama_index import download_loader
|
8 |
from llama_index.readers.schema.base import Document
|
9 |
|
10 |
+
from core.lifecycle import Lifecycle
|
11 |
+
|
12 |
|
13 |
class WikiLoader(ABC):
|
14 |
@abstractmethod
|
|
|
16 |
pass
|
17 |
|
18 |
|
19 |
+
class GithubLoader(WikiLoader, Lifecycle):
|
20 |
def __init__(
|
21 |
self,
|
22 |
github_owner: Optional[str] = None,
|
|
|
53 |
verbose=True,
|
54 |
concurrent_requests=10,
|
55 |
)
|
56 |
+
|
|
|
57 |
docs = loader.load_data(branch="master")
|
58 |
|
59 |
with open("docs/docs.pkl", "wb") as f:
|
llama/index.py
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from core.lifecycle import Lifecycle
|
2 |
+
from llama.context import ServiceContextManager
|
3 |
+
from llama_index.indices.vector_store import VectorStoreIndex
|
4 |
+
from typing import Optional
|
5 |
+
|
6 |
+
|
7 |
+
class IndexManager(Lifecycle):
|
8 |
+
index: Optional[VectorStoreIndex]
|
9 |
+
|
10 |
+
def __init__(self, context_manager: ServiceContextManager) -> None:
|
11 |
+
super().__init__()
|
12 |
+
self.index = None
|
13 |
+
self.context_manager = context_manager
|
14 |
+
|
15 |
+
def get_index(self) -> Optional[VectorStoreIndex]:
|
16 |
+
if not self.lifecycle_state.is_started():
|
17 |
+
raise Exception("Lifecycle state is not correct")
|
18 |
+
return self.index
|
llama/service_context.py
DELETED
@@ -1,142 +0,0 @@
|
|
1 |
-
from abc import abstractmethod, ABC
|
2 |
-
|
3 |
-
from llama_index import ServiceContext, LLMPredictor, LangchainEmbedding
|
4 |
-
|
5 |
-
from core.lifecycle import Lifecycle
|
6 |
-
from langchain_manager.manager import BaseLangChainManager
|
7 |
-
|
8 |
-
|
9 |
-
# def get_callback_manager() -> CallbackManager:
|
10 |
-
# from llama_index.callbacks import (
|
11 |
-
# WandbCallbackHandler,
|
12 |
-
# CallbackManager,
|
13 |
-
# LlamaDebugHandler,
|
14 |
-
# )
|
15 |
-
# llama_debug = LlamaDebugHandler(print_trace_on_end=True)
|
16 |
-
# # wandb.init args
|
17 |
-
# run_args = dict(
|
18 |
-
# project="llamaindex",
|
19 |
-
# )
|
20 |
-
# wandb_callback = WandbCallbackHandler(run_args=run_args)
|
21 |
-
# return CallbackManager([llama_debug, wandb_callback])
|
22 |
-
|
23 |
-
|
24 |
-
class ServiceContextManager(Lifecycle, ABC):
|
25 |
-
@abstractmethod
|
26 |
-
def get_service_context(self) -> ServiceContext:
|
27 |
-
pass
|
28 |
-
|
29 |
-
|
30 |
-
class AzureServiceContextManager(ServiceContextManager):
|
31 |
-
lc_manager: BaseLangChainManager
|
32 |
-
service_context: ServiceContext
|
33 |
-
|
34 |
-
def __init__(self, lc_manager: BaseLangChainManager):
|
35 |
-
super().__init__()
|
36 |
-
self.lc_manager = lc_manager
|
37 |
-
|
38 |
-
def get_service_context(self) -> ServiceContext:
|
39 |
-
if self.service_context is None:
|
40 |
-
raise ValueError(
|
41 |
-
"service context is not ready, check for lifecycle statement"
|
42 |
-
)
|
43 |
-
return self.service_context
|
44 |
-
|
45 |
-
def do_init(self) -> None:
|
46 |
-
# define embedding
|
47 |
-
embedding = LangchainEmbedding(self.lc_manager.get_embedding())
|
48 |
-
# define LLM
|
49 |
-
llm_predictor = LLMPredictor(llm=self.lc_manager.get_llm())
|
50 |
-
# configure service context
|
51 |
-
self.service_context = ServiceContext.from_defaults(
|
52 |
-
llm_predictor=llm_predictor,
|
53 |
-
embed_model=embedding,
|
54 |
-
# callback_manager=get_callback_manager(),
|
55 |
-
)
|
56 |
-
|
57 |
-
def do_start(self) -> None:
|
58 |
-
self.logger.info(
|
59 |
-
"[do_start][embedding] last used usage: %d",
|
60 |
-
self.service_context.embed_model.total_tokens_used,
|
61 |
-
)
|
62 |
-
self.logger.info(
|
63 |
-
"[do_start][predict] last used usage: %d",
|
64 |
-
self.service_context.llm_predictor.total_tokens_used,
|
65 |
-
)
|
66 |
-
|
67 |
-
def do_stop(self) -> None:
|
68 |
-
self.logger.info(
|
69 |
-
"[do_stop][embedding] last used usage: %d",
|
70 |
-
self.service_context.embed_model.total_tokens_used,
|
71 |
-
)
|
72 |
-
self.logger.info(
|
73 |
-
"[do_stop][predict] last used usage: %d",
|
74 |
-
self.service_context.llm_predictor.total_tokens_used,
|
75 |
-
)
|
76 |
-
|
77 |
-
def do_dispose(self) -> None:
|
78 |
-
self.logger.info(
|
79 |
-
"[do_dispose] total used token: %d",
|
80 |
-
self.service_context.llm_predictor.total_tokens_used,
|
81 |
-
)
|
82 |
-
|
83 |
-
|
84 |
-
class HuggingFaceChineseOptServiceContextManager(ServiceContextManager):
|
85 |
-
lc_manager: BaseLangChainManager
|
86 |
-
service_context: ServiceContext
|
87 |
-
|
88 |
-
def __init__(self, lc_manager: BaseLangChainManager):
|
89 |
-
super().__init__()
|
90 |
-
self.lc_manager = lc_manager
|
91 |
-
|
92 |
-
def get_service_context(self) -> ServiceContext:
|
93 |
-
if self.service_context is None:
|
94 |
-
raise ValueError(
|
95 |
-
"service context is not ready, check for lifecycle statement"
|
96 |
-
)
|
97 |
-
return self.service_context
|
98 |
-
|
99 |
-
def do_init(self) -> None:
|
100 |
-
# define embedding
|
101 |
-
from langchain.embeddings import HuggingFaceEmbeddings
|
102 |
-
|
103 |
-
model_name = "GanymedeNil/text2vec-large-chinese"
|
104 |
-
hf_embedding = HuggingFaceEmbeddings(
|
105 |
-
model_name=model_name, model_kwargs={"device": "cpu"}
|
106 |
-
)
|
107 |
-
|
108 |
-
embedding = LangchainEmbedding(hf_embedding)
|
109 |
-
# define LLM
|
110 |
-
llm_predictor = LLMPredictor(self.lc_manager.get_llm())
|
111 |
-
# configure service context
|
112 |
-
self.service_context = ServiceContext.from_defaults(
|
113 |
-
llm_predictor=llm_predictor,
|
114 |
-
embed_model=embedding,
|
115 |
-
# callback_manager=get_callback_manager()
|
116 |
-
)
|
117 |
-
|
118 |
-
def do_start(self) -> None:
|
119 |
-
self.logger.info(
|
120 |
-
"[do_start][embedding] last used usage: %d",
|
121 |
-
self.service_context.embed_model.total_tokens_used,
|
122 |
-
)
|
123 |
-
self.logger.info(
|
124 |
-
"[do_start][predict] last used usage: %d",
|
125 |
-
self.service_context.llm_predictor.total_tokens_used,
|
126 |
-
)
|
127 |
-
|
128 |
-
def do_stop(self) -> None:
|
129 |
-
self.logger.info(
|
130 |
-
"[do_stop][embedding] last used usage: %d",
|
131 |
-
self.service_context.embed_model.total_tokens_used,
|
132 |
-
)
|
133 |
-
self.logger.info(
|
134 |
-
"[do_stop][predict] last used usage: %d",
|
135 |
-
self.service_context.llm_predictor.total_tokens_used,
|
136 |
-
)
|
137 |
-
|
138 |
-
def do_dispose(self) -> None:
|
139 |
-
self.logger.info(
|
140 |
-
"[do_dispose] total used token: %d",
|
141 |
-
self.service_context.llm_predictor.total_tokens_used,
|
142 |
-
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
llama/storage_context.py
DELETED
@@ -1,67 +0,0 @@
|
|
1 |
-
from llama_index import StorageContext
|
2 |
-
from typing import List
|
3 |
-
from abc import abstractmethod, ABC
|
4 |
-
|
5 |
-
from llama_index import Document
|
6 |
-
|
7 |
-
from core.lifecycle import Lifecycle
|
8 |
-
from llama.service_context import ServiceContextManager
|
9 |
-
|
10 |
-
|
11 |
-
class StorageContextManager(Lifecycle, ABC):
|
12 |
-
@abstractmethod
|
13 |
-
def get_storage_context(self) -> StorageContext:
|
14 |
-
pass
|
15 |
-
|
16 |
-
|
17 |
-
class LocalStorageContextManager(StorageContextManager):
|
18 |
-
storage_context: StorageContext
|
19 |
-
|
20 |
-
def __init__(
|
21 |
-
self,
|
22 |
-
service_context_manager: ServiceContextManager,
|
23 |
-
dataset_path: str = "./dataset",
|
24 |
-
) -> None:
|
25 |
-
super().__init__()
|
26 |
-
self.dataset_path = dataset_path
|
27 |
-
self.service_context_manager = service_context_manager
|
28 |
-
|
29 |
-
def get_storage_context(self) -> StorageContext:
|
30 |
-
return self.storage_context
|
31 |
-
|
32 |
-
def do_init(self) -> None:
|
33 |
-
from llama.utils import is_local_storage_files_ready
|
34 |
-
|
35 |
-
if is_local_storage_files_ready(self.dataset_path):
|
36 |
-
self.storage_context = StorageContext.from_defaults(
|
37 |
-
persist_dir=self.dataset_path
|
38 |
-
)
|
39 |
-
else:
|
40 |
-
docs = self._download()
|
41 |
-
self._indexing(docs)
|
42 |
-
|
43 |
-
def do_start(self) -> None:
|
44 |
-
# self.logger.info("[do_start]%", **self.storage_context.to_dict())
|
45 |
-
pass
|
46 |
-
|
47 |
-
def do_stop(self) -> None:
|
48 |
-
# self.logger.info("[do_stop]%", **self.storage_context.to_dict())
|
49 |
-
pass
|
50 |
-
|
51 |
-
def do_dispose(self) -> None:
|
52 |
-
self.storage_context.persist(self.dataset_path)
|
53 |
-
|
54 |
-
def _download(self) -> List[Document]:
|
55 |
-
from llama.data_loader import GithubLoader
|
56 |
-
|
57 |
-
loader = GithubLoader()
|
58 |
-
return loader.load()
|
59 |
-
|
60 |
-
def _indexing(self, docs: List[Document]) -> None:
|
61 |
-
from llama_index import GPTVectorStoreIndex
|
62 |
-
|
63 |
-
index = GPTVectorStoreIndex.from_documents(
|
64 |
-
docs, service_context=self.service_context_manager.get_service_context()
|
65 |
-
)
|
66 |
-
index.storage_context.persist(persist_dir=self.dataset_path)
|
67 |
-
self.storage_context = index.storage_context
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
llama/utils.py
DELETED
@@ -1,5 +0,0 @@
|
|
1 |
-
import os
|
2 |
-
|
3 |
-
|
4 |
-
def is_local_storage_files_ready(persist_dir: str) -> bool:
|
5 |
-
return os.path.exists(persist_dir) and len(os.listdir(persist_dir)) != 0
|
|
|
|
|
|
|
|
|
|
|
|
llama/vector_storage.py
ADDED
@@ -0,0 +1,18 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from core.lifecycle import Lifecycle
|
2 |
+
|
3 |
+
|
4 |
+
class VectorStorageManager(Lifecycle):
|
5 |
+
def __init__(self) -> None:
|
6 |
+
super().__init__()
|
7 |
+
|
8 |
+
def do_init(self) -> None:
|
9 |
+
pass
|
10 |
+
|
11 |
+
def do_start(self) -> None:
|
12 |
+
pass
|
13 |
+
|
14 |
+
def do_stop(self) -> None:
|
15 |
+
pass
|
16 |
+
|
17 |
+
def do_dispose(self) -> None:
|
18 |
+
pass
|
local-requirements.txt
DELETED
@@ -1 +0,0 @@
|
|
1 |
-
python-dotenv
|
|
|
|
pyproject.toml
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
[tool.mypy]
|
2 |
ignore_missing_imports = "True"
|
3 |
disallow_untyped_defs = "True"
|
4 |
-
exclude = ["notebooks", "build", "examples", "docs", "dataset", "github_retriever.py"]
|
5 |
|
6 |
[tool.ruff]
|
7 |
exclude = [
|
@@ -14,5 +14,6 @@ exclude = [
|
|
14 |
"notebooks",
|
15 |
"docs",
|
16 |
"dataset",
|
|
|
17 |
"github_retriever.py"
|
18 |
]
|
|
|
1 |
[tool.mypy]
|
2 |
ignore_missing_imports = "True"
|
3 |
disallow_untyped_defs = "True"
|
4 |
+
exclude = ["notebooks", "build", "examples", "docs", "dataset", "app.py", "github_retriever.py"]
|
5 |
|
6 |
[tool.ruff]
|
7 |
exclude = [
|
|
|
14 |
"notebooks",
|
15 |
"docs",
|
16 |
"dataset",
|
17 |
+
"app.py",
|
18 |
"github_retriever.py"
|
19 |
]
|
requirements.txt
CHANGED
@@ -1,10 +1,7 @@
|
|
1 |
-
llama_index
|
2 |
-
llama_hub
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
python-dotenv
|
9 |
-
sentence_transformers
|
10 |
-
wandb
|
|
|
1 |
+
llama_index
|
2 |
+
llama_hub
|
3 |
+
langchain
|
4 |
+
dotenv
|
5 |
+
ruff
|
6 |
+
black
|
7 |
+
mypy
|
|
|
|
|
|
xpipe_wiki/__init__.py
DELETED
File without changes
|
xpipe_wiki/manager_factory.py
DELETED
@@ -1,82 +0,0 @@
|
|
1 |
-
import enum
|
2 |
-
import os
|
3 |
-
|
4 |
-
from core.helper import LifecycleHelper
|
5 |
-
from xpipe_wiki.robot_manager import XPipeWikiRobotManager, AzureXPipeWikiRobotManager
|
6 |
-
|
7 |
-
from multiprocessing import Lock
|
8 |
-
|
9 |
-
lock = Lock()
|
10 |
-
|
11 |
-
|
12 |
-
class XPipeRobotRevision(enum.Enum):
|
13 |
-
SIMPLE_OPENAI_VERSION_0 = 1
|
14 |
-
HUGGINGFACE_VERSION_0 = 2
|
15 |
-
|
16 |
-
|
17 |
-
class XPipeRobotManagerFactory:
|
18 |
-
"""
|
19 |
-
CAPABLE: Dict[XPipeRobotRevision, XPipeWikiRobotManager] =
|
20 |
-
{XPipeRobotRevision.SIMPLE_OPENAI_VERSION_0: XPipeWikiRobotManager()}
|
21 |
-
"""
|
22 |
-
|
23 |
-
CAPABLE = dict() # type: dict[XPipeRobotRevision, XPipeWikiRobotManager]
|
24 |
-
|
25 |
-
@classmethod
|
26 |
-
def get_or_create(cls, revision: XPipeRobotRevision) -> XPipeWikiRobotManager:
|
27 |
-
with lock:
|
28 |
-
if cls.CAPABLE.get(revision) is not None:
|
29 |
-
return cls.CAPABLE[revision]
|
30 |
-
if revision == XPipeRobotRevision.SIMPLE_OPENAI_VERSION_0:
|
31 |
-
manager = cls.create_simple_openai_version_0()
|
32 |
-
elif revision == XPipeRobotRevision.HUGGINGFACE_VERSION_0:
|
33 |
-
manager = cls.create_huggingface_version_0()
|
34 |
-
cls.CAPABLE[revision] = manager
|
35 |
-
return manager
|
36 |
-
|
37 |
-
@classmethod
|
38 |
-
def create_simple_openai_version_0(cls) -> AzureXPipeWikiRobotManager:
|
39 |
-
from llama.service_context import AzureServiceContextManager
|
40 |
-
from langchain_manager.manager import LangChainAzureManager
|
41 |
-
|
42 |
-
service_context_manager = AzureServiceContextManager(
|
43 |
-
lc_manager=LangChainAzureManager()
|
44 |
-
)
|
45 |
-
from llama.storage_context import LocalStorageContextManager
|
46 |
-
|
47 |
-
dataset_path = os.getenv("XPIPE_WIKI_DATASET_PATH", "./dataset")
|
48 |
-
storage_context_manager = LocalStorageContextManager(
|
49 |
-
dataset_path=dataset_path, service_context_manager=service_context_manager
|
50 |
-
)
|
51 |
-
|
52 |
-
robot_manager = AzureXPipeWikiRobotManager(
|
53 |
-
service_context_manager=service_context_manager,
|
54 |
-
storage_context_manager=storage_context_manager,
|
55 |
-
)
|
56 |
-
LifecycleHelper.initialize_if_possible(robot_manager)
|
57 |
-
LifecycleHelper.start_if_possible(robot_manager)
|
58 |
-
return robot_manager
|
59 |
-
|
60 |
-
@classmethod
|
61 |
-
def create_huggingface_version_0(cls) -> AzureXPipeWikiRobotManager:
|
62 |
-
from llama.service_context import HuggingFaceChineseOptServiceContextManager
|
63 |
-
from langchain_manager.manager import LangChainAzureManager
|
64 |
-
|
65 |
-
service_context_manager = HuggingFaceChineseOptServiceContextManager(
|
66 |
-
lc_manager=LangChainAzureManager()
|
67 |
-
)
|
68 |
-
|
69 |
-
from llama.storage_context import LocalStorageContextManager
|
70 |
-
|
71 |
-
dataset_path = os.getenv("XPIPE_WIKI_DATASET_PATH", "./dataset")
|
72 |
-
storage_context_manager = LocalStorageContextManager(
|
73 |
-
dataset_path=dataset_path, service_context_manager=service_context_manager
|
74 |
-
)
|
75 |
-
|
76 |
-
robot_manager = AzureXPipeWikiRobotManager(
|
77 |
-
service_context_manager=service_context_manager,
|
78 |
-
storage_context_manager=storage_context_manager,
|
79 |
-
)
|
80 |
-
LifecycleHelper.initialize_if_possible(robot_manager)
|
81 |
-
LifecycleHelper.start_if_possible(robot_manager)
|
82 |
-
return robot_manager
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
xpipe_wiki/robot_manager.py
DELETED
@@ -1,79 +0,0 @@
|
|
1 |
-
from abc import ABC, abstractmethod
|
2 |
-
from typing import Any
|
3 |
-
|
4 |
-
from llama_index import load_index_from_storage
|
5 |
-
from llama_index.indices.query.base import BaseQueryEngine
|
6 |
-
from llama_index.indices.response import ResponseMode
|
7 |
-
|
8 |
-
from core.helper import LifecycleHelper
|
9 |
-
from core.lifecycle import Lifecycle
|
10 |
-
from llama.service_context import ServiceContextManager
|
11 |
-
from llama.storage_context import StorageContextManager
|
12 |
-
|
13 |
-
|
14 |
-
class XPipeWikiRobot(ABC):
|
15 |
-
@abstractmethod
|
16 |
-
def ask(self, question: str) -> Any:
|
17 |
-
pass
|
18 |
-
|
19 |
-
|
20 |
-
class AzureOpenAIXPipeWikiRobot(XPipeWikiRobot):
|
21 |
-
query_engine: BaseQueryEngine
|
22 |
-
|
23 |
-
def __init__(self, query_engine: BaseQueryEngine) -> None:
|
24 |
-
super().__init__()
|
25 |
-
self.query_engine = query_engine
|
26 |
-
|
27 |
-
def ask(self, question: str) -> Any:
|
28 |
-
print("question: ", question)
|
29 |
-
response = self.query_engine.query(question)
|
30 |
-
print("response type: ", type(response))
|
31 |
-
return response.__str__()
|
32 |
-
|
33 |
-
|
34 |
-
class XPipeWikiRobotManager(Lifecycle):
|
35 |
-
@abstractmethod
|
36 |
-
def get_robot(self) -> XPipeWikiRobot:
|
37 |
-
pass
|
38 |
-
|
39 |
-
|
40 |
-
class AzureXPipeWikiRobotManager(XPipeWikiRobotManager):
|
41 |
-
service_context_manager: ServiceContextManager
|
42 |
-
storage_context_manager: StorageContextManager
|
43 |
-
query_engine: BaseQueryEngine
|
44 |
-
|
45 |
-
def __init__(
|
46 |
-
self,
|
47 |
-
service_context_manager: ServiceContextManager,
|
48 |
-
storage_context_manager: StorageContextManager,
|
49 |
-
) -> None:
|
50 |
-
super().__init__()
|
51 |
-
self.service_context_manager = service_context_manager
|
52 |
-
self.storage_context_manager = storage_context_manager
|
53 |
-
|
54 |
-
def get_robot(self) -> XPipeWikiRobot:
|
55 |
-
return AzureOpenAIXPipeWikiRobot(self.query_engine)
|
56 |
-
|
57 |
-
def do_init(self) -> None:
|
58 |
-
LifecycleHelper.initialize_if_possible(self.service_context_manager)
|
59 |
-
LifecycleHelper.initialize_if_possible(self.storage_context_manager)
|
60 |
-
|
61 |
-
def do_start(self) -> None:
|
62 |
-
LifecycleHelper.start_if_possible(self.service_context_manager)
|
63 |
-
LifecycleHelper.start_if_possible(self.storage_context_manager)
|
64 |
-
index = load_index_from_storage(
|
65 |
-
storage_context=self.storage_context_manager.get_storage_context(),
|
66 |
-
service_context=self.service_context_manager.get_service_context(),
|
67 |
-
)
|
68 |
-
self.query_engine = index.as_query_engine(
|
69 |
-
service_context=self.service_context_manager.get_service_context(),
|
70 |
-
response_mode=ResponseMode.TREE_SUMMARIZE,
|
71 |
-
)
|
72 |
-
|
73 |
-
def do_stop(self) -> None:
|
74 |
-
LifecycleHelper.stop_if_possible(self.storage_context_manager)
|
75 |
-
LifecycleHelper.stop_if_possible(self.service_context_manager)
|
76 |
-
|
77 |
-
def do_dispose(self) -> None:
|
78 |
-
LifecycleHelper.dispose_if_possible(self.storage_context_manager)
|
79 |
-
LifecycleHelper.dispose_if_possible(self.service_context_manager)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|